MongoDB 递减直到零

Ale*_*hin 6 mongodb mongodb-query

我想在 MongoDB 中实现类似于doc.value = max(doc.value - amount, 0). 我可以通过获取文档、更新其值然后保存它来做到这一点,但是是否可以使用原子操作来避免并行递减的同步问题?

cod*_*key 6

事实上,可以通过单个操作来实现。您所需要的只是更新运算符内的聚合管道。

假设您有一个如下所示的文档:

{
    "key": 1,
    value: 30
}
Run Code Online (Sandbox Code Playgroud)

您想要从中减去 x,value如果结果值小于零,则设置value为 0,否则将其设置为value- x 的值。这是您需要的更新聚合器。在此示例中,我从 中减去 20 value

db.collection.update({
  key: 1
},
[
  {
    $set: {
      "value": {
        $cond: [
          {
            $gt: [
              {
                $subtract: [
                  "$value",
                  20
                ]
              },
              0
            ]
          },
          {
            $subtract: [
              "$value",
              20
            ]
          },
          0
        ]
      }
    }
  }
])
Run Code Online (Sandbox Code Playgroud)

结果将是:

  {
    "key": 1,
    "value": 10
  }
Run Code Online (Sandbox Code Playgroud)

但如果将 20 更改为 44,结果是:

  {
    "key": 1,
    "value": 0
  }
Run Code Online (Sandbox Code Playgroud)

这是一个适合您的游乐场:https ://mongoplayground.net/p/Y9yO6v9Oca8