MongoDB 值递减,防止负数

问题描述 投票:0回答:1

我正在使用 MongoDB,并且我有一个文档,我想在其中增加计数字段。但是,我需要确保该计数不会低于零。例如,如果 inc 为 -2 并且当前计数为 1,则应用 $inc 将导致 -1,这是我想避免的。

这是我当前使用的更新操作:

db.collection.updateMany(
  { '_id': {'$in': object_ids} },
  { 
    '$inc': { 'count': inc },
    '$addToSet': {...},
    '$set': {...},
  }
)

我已经尝试过这 2 个,但是由于“$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 mongodb-query atomic increment mongodb-update
1个回答
0
投票

一种可能的解决方案是使用两步过程:

  • 使用 updateMany 和

    $inc
    来增加文档的计数字段。

    db.collection.updateMany(
            { '_id': { '$in': object_ids } },
            { 
              '$inc': { 'count': inc },
              '$addToSet': {...},
              '$set': {...},
            }
          )
    
  • 使用另一个

    updateMany
    操作与
    $max
    将任何负计数字段设置为零。

      db.collection.updateMany(
        { '_id': { '$in': object_ids }, 'count': { '$lt': 0 } },
        { 
          '$set': { 'count': 0 }
        }
      )
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.