考虑以下代码:
findAndModify({id: id}, undefined, {$inc: {counter: 1}, {$max: {counter: 10})这将失败,因为$inc和$max都试图更新同一个字段。
但是,如果我想将计数器设置为10,如果它的值小于10,如果不是,将它的值增加1,该怎么办?如何在一次原子操作中做到这一点?
是否有一种方法可以在单个操作中依次应用更新?
发布于 2018-08-13 12:40:22
我不认为一次手术就能做到这一点。但是,可以使用条件语句创建聚合查询,然后在更新中使用这些语句。
(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
)https://stackoverflow.com/questions/51822448
复制相似问题