从其他字段更新mongo数组元素字段

时间:2020-05-21 22:43:08

标签: arrays mongodb mongodb-query aggregation-framework pymongo-3.x

让我们假设以下文件

{
    "companies": [
        {"id": 1, "name": "Company 1", "new_name": "New company 1"},
        {"id": 2, "name": "Company 2", "new_name": "New company 2"}
    ]
}

有没有办法我可以自己引用数组元素以迁移到方案

{
    "companies": [
        {"id": 1, "name": "New company 1", "new_name": "New company 1"},
        {"id": 2, "name": "New company 2", "new_name": "New company 2"}
    ]
}

在一次调用update中而不用mongo 4.2中的forEach编写脚本? 像

update(
...
{
  "companies.$[].name": "$companies.<???>.new_name"
}
)

1 个答案:

答案 0 :(得分:1)

要在查询中访问另一个字段的值,您需要使用聚合,并利用在MongoDB版本4.2中引入的.update()中执行聚合管道的优势,请尝试以下查询:

update(
    ...
    [
        {
          $addFields: { // will replace existing field with new value
            companies: {
              $map: { // Iterates on an array & creates a new one
                input: "$companies",
                in: { $mergeObjects: [ "$$this", { name: "$$this.new_name" } ] } // `mergeObjects` will merge two objects `name` field will be replace in current object i.e; `$$this`
              }
            }
          }
        }
      ]
    )

测试::您可以在此处测试聚合管道:mongoplayground

注意::似乎仅在一次调用中使用聚合是这样做的选择,但不利之处可能仅在于您的数组太大,因为$map必须重写整个阵列再次。