使用$ set和$ [identifier]更新嵌套数组中的对象(mongoDB 3.6)

时间:2018-02-09 17:18:07

标签: mongodb

MongoDB 3.6允许对任何数组中的所有匹配元素执行复杂的数组操作 - 无论嵌套有多深 - Update Nested Arrays with $[identifier]

请考虑以下survey集合中的文档:

{
    "_id": "5a7d86d8fac139e71b0b9f5b",
    "results": [
      {
        "items": [
          {
            "comments": [
              {
                "id" : "123456",
                "email": "user@email.com",
                "content": "comment 1",
                "createdAt": "2018-05-03"
                "replies": []
              }
            ]
          }
        ]
      }
    ]
  }

我正在尝试更新评论emailcontentcreatedAt字段,而不会触及idreplies字段。

我正在使用$set和新的$[<identifier>]

我根据The update command 尝试了下面的command

db.runCommand({
  update: "survey",
  updates: [
    {
      q: {},
      u: {
        $set: {
          "results.$[].items.$[].comments.$[comment]": {
            "email": "user2@email.com",
            "content": "comment 2",
            "createdAt": "2018-05-04"
          }
        }
      },
      arrayFilters: [
        {
          "comment.id": { 
            $eq: "123456"
          }
        }
      ]
    }
  ]
})

该命令有效但删除了idreplies字段。

有任何帮助吗?感谢。

1 个答案:

答案 0 :(得分:1)

文档$set

{}会覆盖匹配的文档。使用$set并使用点表示法列出所有文档字段以执行字段级更新。更多here

db.runCommand({
  update: "survey",
  updates: [
    {
      q: {},
      u: {
        $set: {
          "results.$[].items.$[].comments.$[comment].email": "user2@email.com",
          "results.$[].items.$[].comments.$[comment].content": "comment 2",
          "results.$[].items.$[].comments.$[comment].createdAt": "2018-05-04"
        }
      },
      arrayFilters: [
        {
          "comment.id": { 
            $eq: "123456"
          }
        }
      ]
    }
  ]
})