考虑以下代码:
findAndModify({id: id}, undefined, {$inc: {counter: 1}, {$max: {counter: 10})
此操作失败并显示错误,因为$inc
和$max
都尝试更新同一字段。
但是,如果我想将计数器的值设置为小于10的值,而不是将计数器的值增加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
)