Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB:如果小于10,则将字段值设置为10,否则增加1_Node.js_Mongodb_Mongoose_Nosql_Mongodb Query - Fatal编程技术网

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

Node.js MongoDB:如果小于10,则将字段值设置为10,否则增加1,node.js,mongodb,mongoose,nosql,mongodb-query,Node.js,Mongodb,Mongoose,Nosql,Mongodb Query,考虑以下代码: findAndModify({id: id}, undefined, {$inc: {counter: 1}, {$max: {counter: 10}) 由于$inc和$max都试图更新同一字段,因此此操作失败并出现错误 但是如果我想将计数器的值设置为10,如果它的值小于10,如果不是,则将它的值增加1,该怎么办?如何在一个原子操作中做到这一点 有没有一种方法可以在一次操作中按顺序应用更新?我认为这不可能在一次操作中完成。但是,您可以使用条件语句创建聚合查询,然后在更新中使用

考虑以下代码:

findAndModify({id: id}, undefined, {$inc: {counter: 1}, {$max: {counter: 10})
由于
$inc
$max
都试图更新同一字段,因此此操作失败并出现错误

但是如果我想将计数器的值设置为10,如果它的值小于10,如果不是,则将它的值增加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);
    }
})()

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

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

mongo不可能@Soggiorno chridam最初的答案是正确的。对
计数器的任何其他更新也应防止其超过10。@JohnnyHK是的,他的原始答案是正确的。我犯了一个错误,没有正确地阐述这个问题。编辑使解决方案完全不同。@chridam谢谢!关于如何使聚合和更新查询原子化以避免并发环境中的竞争条件,您有什么建议吗?@Soggiorno有关更多信息,请参阅本文