Mongo db updateOne使用文档列表更新文档列表

时间:2020-10-21 23:19:02

标签: mongodb mongo-shell

我有一个这样的文件

{
  "_id" : ObjectId("5f90be124e3e00bdfcc0e32f"),
  "data": [
    {"id": "id1", "value": "value1"},
    {"id": "id2", "value": "value2"},
    {"id": "id3", "value": "value3"},
    {"id": "id4", "value": "value4"},
    {"id": "id5", "value": "value5"}
  ],
  "extra_value": "Testing",
  "extra_value1": "Testing1"
}

我想用

进行更新
{
  "_id" : ObjectId("5f90be124e3e00bdfcc0e32f"),
  "data": [
    {"id": "id3", "value": "value3-updated"},
    {"id": "id5", "value": "value5-updated"},
    {"id": "id6", "value": "value6"}
  ],
  "extra_value1": "Testing1-updated"
}

因此必须更新extra_value1,必须更新两个id,即3和5,但是由于不存在id6,因此应将其添加到文档中。最终文件看起来像这样。

{
  "_id" : ObjectId("5f90be124e3e00bdfcc0e32f"),
  "data": [
    {"id": "id1", "value": "value1"},
    {"id": "id2", "value": "value2"},
    {"id": "id3", "value": "value3-updated"},
    {"id": "id4", "value": "value4"},
    {"id": "id5", "value": "value5-updated"},
    {"id": "id6", "value": "value6"}
  ],
  "extra_value": "Testing",
  "extra_value1": "Testing1-updated"
}

我可以对多个更新查询执行此操作,但不能在单个查询中全部执行操作。有办法做这种事吗?谢谢

1 个答案:

答案 0 :(得分:0)

尝试一下-

db.collection.updateMany(
  {_id:ObjectId("5f90be124e3e00bdfcc0e32f") },
  [{
    $set: {
      data: {
        $map: {
          input: "$data",
          in: {
            $mergeObjects: [
              "$$this",
              {
                $cond: [
                  { $eq: ["$$this.id", "id3"] },
                  { value: "value3-updated" },
                  {$cond: [
                      {$eq: ["$$this.id", "id5"]},
                      {value: "value5-updated"},
                      {}
                      ]}
                ]
              }
            ]
          }
        }
      },
      "extra_value1" : "Testing1-updated"
    }
  }
      ]
)

这将对id3id5extra_value1字段执行所有更新,但仍不会为id6添加新条目。

花了很多时间来添加它。但是没有运气。我什至不知道那是不可能的。

我还是希望以上查询对您有所帮助。谢谢!