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有关更多信息,请参阅本文