【问题标题】:MongoDB: $mergeObjects is overwriting object data in update pipelineMongoDB:$mergeObjects 正在覆盖更新管道中的对象数据
【发布时间】:2022-01-27 21:09:37
【问题描述】:

在更新管道中使用$mergeObjects 时,原始对象正在 覆盖。是否有任何替代方法可以避免这种情况发生,或者可以以任何方式使用$mergeObjects 来避免这种情况。

我有一份文件如下:

{
    "employment": {
      "selfEmployed": {
          "netProfit": 1000,
          "addbacks": [
              {
                "addbackId": "5a934e000102030405000001",
                "value": 1000,
              }
            ]
      }
    }
}

我有更新数据如下:

const update = {
    "selfEmployed": {
        "netProfit": 22,
    }
  };

更新查询是:

db.collection.update({},
[
  {
    $set: {
      "employment": {
        $mergeObjects: [
          "$employment",
          update
        ]
      }
    }
  }
])

但是$mergeObjects 会覆盖对象以给出以下结果:

  {
    "employment": {
      "selfEmployed": {
        "netProfit": 22
      }
    }
  }

预期结果:

{
    "employment": {
      "selfEmployed": {
          "netProfit": 22,
          "addbacks": [
              {
                "addbackId": "5a934e000102030405000001",
                "value": 1000,
              }
            ]
      }
    }
}

Playground

编辑 1:

我只能依靠顶级字段来执行更新。 下面的一些答案适用于selfEmployed。 但我也有其他领域的收藏。 例如

{
    "employment": {
      "selfEmployed": {
          "netProfit": 1000,
          "addbacks": [
              {
                "addbackId": "5a934e000102030405000001",
                "value": 1000,
              }
            ]
      },
      "unemployed": {
          "reason": "some reason",
          //... other data
      }
      // .. other data
    }
}

而且我不想重复或编写多个查询来更新嵌套字段,并且使用直接设置也是不可能的。 我正在寻找一种使用上面给出的更新管道的方法。

【问题讨论】:

    标签: javascript node.js mongodb mongodb-query aggregation-framework


    【解决方案1】:

    根据$mergeObjects Behaviour

    $mergeObjects 在合并文档时会覆盖字段值。如果要合并的文档包含相同的字段名称,则生成的文档中的字段具有为该字段合并的最后一个文档的值。

    因此,原来的employment.selfEmployed 将被替换为新值。


    解决方案 1:将 $set 值直接指定为 employment.selfEmployed.netProfit

    db.collection.update({},
    [
      {
        $set: {
          "employment.selfEmployed.netProfit": 22
        }
      }
    ])
    

    Sample Mongo Playground for Solution 1


    解决方案 2:$mergeObjects 仅适用于 employment.selfEmployed

    db.collection.update({},
    [
      {
        $set: {
          "employment.selfEmployed": {
            $mergeObjects: [
              "$employment.selfEmployed",
              {
                "netProfit": 22
              }
            ]
          }
        }
      }
    ])
    

    Sample Mongo Playground for Solution 2

    【讨论】:

    • 是的,您的回答将适用于某一特定更新。但可能不会只更新一个字段。我会正确编辑我的答案!
    猜你喜欢
    • 2021-11-03
    • 2019-03-06
    • 2014-02-06
    • 2014-02-13
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多