Mongodb 更新文档中的一个字段,然后根据前一个字段的值更新另一个字段

Mongodb Update a field in a document and then update another depending on the value of previous field

我有这样的文档

    {
      "_id": ObjectId("626f942bb092f78afd9dad9d"),
      "item_id": "external _id222",
      "metadata": {
        "item_name": "abc",
        "quantity": 123,
        "state": null
      },
    }

我想做的是,$inc 即增加 quantity 的计数,然后将 state 更新为已售出,如果 quantity 等于 124。我可以通过 2 个查询、更新 quantity、执行 if-else 检查然后更新 state 来做到这一点。有没有办法在 update() 的一个查询中做到这一点? (最好不要聚合)

你可以这样做

  1. 检查 quantity 是否为 123
  2. 然后将 quantityset 状态增加到 SOLD

playground

db.collection.update({
  "metadata.quantity": 123
},
{
  "$inc": {
    "metadata.quantity": 1
  },
  "$set": {
    "metadata.state": "SOLD"
  }
},
{
  "multi": false,
  "upsert": false
})

这里的诀窍是你需要检查$inc操作之前的值。

使用 MongoDB v4.2+,您可以使用聚合管道通过单个更新来实现原子行为。使用 $add 进行增量并使用 $cond 检查数量 = 123

db.collection.update({
  "item_id": "external _id222"
},
[
  {
    $set: {
      "metadata.quantity": {
        $add: [
          "$metadata.quantity",
          1
        ]
      }
    }
  },
  {
    $set: {
      "metadata.state": {
        $cond: {
          if: {
            $eq: [
              "$metadata.quantity",
              124
            ]
          },
          then: "SOLID",
          else: "$metadata.state"
        }
      }
    }
  }
],
{
  multi: true
})

这里是Mongo playground供大家参考。