首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB:如果小于10,则将字段值设置为10,否则增加1

MongoDB:如果小于10,则将字段值设置为10,否则增加1
EN

Stack Overflow用户
提问于 2018-08-13 12:31:39
回答 1查看 732关注 0票数 2

考虑以下代码:

代码语言:javascript
运行
复制
findAndModify({id: id}, undefined, {$inc: {counter: 1}, {$max: {counter: 10})

这将失败,因为$inc$max都试图更新同一个字段。

但是,如果我想将计数器设置为10,如果它的值小于10,如果不是,将它的值增加1,该怎么办?如何在一次原子操作中做到这一点?

是否有一种方法可以在单个操作中依次应用更新?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-13 12:40:22

我不认为一次手术就能做到这一点。但是,可以使用条件语句创建聚合查询,然后在更新中使用这些语句。

代码语言:javascript
运行
复制
(async () => {
    try {
        const results = await Model.aggregate([
            { '$match': { 'id': id } },
            { '$project': { 
                'counter': { 
                    '$cond': [
                        { '$lt': ['$counter', 10 ] },
                        10,
                        { '$add': ['$counter', 1 ] }
                    ] 
                }
            } }
        ]).exec();

        const data = results[0];
        const { counter } = data;

        const doc = await Model.findOneAndUpdate({ id },
            { '$set': { counter } },
            { new: true }
        ).exec();

        console.log(doc);
    } 
    catch (err) {
        console.error(err);
    }
})()

对于原子更新,包括一个查询,该查询限制只有counter小于给定上限值10的文档的增量:

代码语言:javascript
运行
复制
findAndModify(
    {
        'id': id,
        'counter': { '$lt': 10 } 
    }, undefined, 
    { '$inc': { 'counter': 1 } },
    callback
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51822448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档