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

时间:2018-08-13 12:31:40

标签: node.js mongodb mongoose nosql mongodb-query

考虑以下代码:

findAndModify({id: id}, undefined, {$inc: {counter: 1}, {$max: {counter: 10})

此操作失败并显示错误,因为$inc$max都尝试更新同一字段。

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

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

1 个答案:

答案 0 :(得分:1)

我认为这不可能一次完成。但是,您可以使用在更新中使用的条件语句创建汇总查询。

(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的文档的增量:

findAndModify(
    {
        'id': id,
        'counter': { '$lt': 10 } 
    }, undefined, 
    { '$inc': { 'counter': 1 } },
    callback
)