我正在使用 MongoDB,我有一个文档,我想在其中递增一个计数字段。但是,我需要确保该计数不会低于零。例如,如果 inc 为-2,而当前计数为 1,那么应用 $inc 将导致计数为-1,而这正是我希望避免的。
以下是我当前使用的更新操作:
db.collection.updateMany(
{'_id':{'$in': object_ids}},
{
'$inc':{ 'count': inc }、
'$addToSet':{...},
'$set':{...},
}
)
我试过这两种方法,但由于"$addToSet "不能作为管道阶段添加,所以我无法使用以下方法:
db.collection.updateMany({ '_id':{'$in': object_ids}}, [ { $set:{ count:{ $cond: { if:{ $gte: [{ $add: ['$count', inc] }, 0] }.}, then:{ $add: ['$count', inc] }, else: 0 }}}}])
我还想到了使用
我还想到了使用
'$expr':{ '$gte': ['$count', 0] }
但这并不能防止递减为负数!可以使用 MongoDB 4.2 中引入的 $min 更新运算符来实现。 $min
运算符将字段设置为更新后的值与现有值中的最小值。
以下是可以如何修改更新操作:
db.collection.updateMany(
{ '_id': { '$in': object_ids } },
[
{
'$inc': { 'count': inc },
},
{
'$set': {
'count': { '$min': ['$count', 0] } // 将计数限制为不小于 0
}
},
{
'$addToSet': { ... },
},
{
'$set': { ... },
},
]
)
此代码的工作原理:
- $inc: 首先,它会按
inc
的值增加count
字段。 - $min: 然后,它使用
$min
运算符将count
字段设置为当前count
值和 0 之间的最小值。如果count
小于 0,则将其设置为 0。 - $addToSet 和 $set: 其余的更新操作将照常执行。
通过这种方法,可以在递增计数的同时确保它永远不会低于零。
注意: 此解决方案使用聚合管道更新语法(方括号 []
中的更新)。如果使用的是 MongoDB 的旧版本,则可能需要调整语法。