在mongo pipeline中,如何仅在字段已存在时设置字段的值?

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

我在mongo中有数据:

{
    items:
    {
        cheese: {  version: 3 },
        egg: {  version: 23 }
    }
}

我的服务收到消息,告知其最新版本的项目。 如果最新的奶酪是版本 4,我希望消息处理程序将奶酪版本更新为 4。

   $set: { "items.cheese.version", 4 }

但是,有时我会收到我不感兴趣的项目的版本号。如果我收到

sausages
的版本,我不想写它,因为它不存在。

我尝试编写一个条件来检查它,并且仅在存在时更新它,但 mongo 想要 else 分支的值。我试过了

$$REMOVE
...

    $set: {
        "items.sausages.version": {
            $cond: {
                if: { $ne: ["$items.sausages", null] },
                then: "7",
                else: "$$REMOVE"
            }
        }

...但它似乎仍然在添加并且数据最终为:

{
    items:
    {
        cheese: {  version: 3 },
        egg: {  version: 23 },
        sausages: {}
    }
}

如何仅更新已存在的项目?

mongodb
1个回答
0
投票

处理您的情况的规范方法之一是使用

$ifNull
来捕获字段不存在或等于 null 的 2 种情况。然后,将
$cond
$mergeObjects
链接起来,在
items
级别执行条件更新。

db.collection.updateMany({
  // your query here
  
},
[
  {
    "$set": {
      "items": {
        "$cond": {
          "if": {
            "$eq": [
              {
                "$ifNull": [
                  "$items.sausages",
                  null
                ]
              },
              null
            ]
          },
          "then": "$items",
          "else": {
            "$mergeObjects": [
              "$items",
              {
                "sausages": {
                  "version": 4
                }
              }
            ]
          }
        }
      }
    }
  }
])

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.