如何在现有 MongoDB 文档中插入对象数组/列表?

Dha*_*dra 1 database mongodb mongodb-query

我有一个 mongo 集合,其中已经存储了文档。单个文档的结构是这样的:

   "_id":ObjectId("55c3043ab165fa6355ec5c9b"),
   "address":{
      "building":"522",
      "coord":[
         -73.95171,
         40.767461
      ],
      "street":"East   74 Street",
      "zipcode":"10021"
   }
}
Run Code Online (Sandbox Code Playgroud)

"persons"现在我想通过插入一个值为对象列表的新字段来更新文档[{"name":"marcus", "contact":"420"}, {"name":"modiji", "contact":"111"}],因此插入后上述文档应如下所示:

   "_id":ObjectId("55c3043ab165fa6355ec5c9b"),
   "address":{
      "building":"522",
      "coord":[
         -73.95171,
         40.767461
      ],
      "street":"East   74 Street",
      "zipcode":"10021"
   },
   "persons":[
      {
         "name":"marcus",
         "contact":"420"
      },
      {
         "name":"modiji",
         "contact":"111"
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

谁能帮助我正确的$set语法吗?另外,如果有人可以建议一种有效的方法来更新键的值(这是一个对象列表),以便我可以在现有列表中推送一些新对象,那将非常有帮助。

hhh*_*a36 6

您可以使用该updateOne命令和$set运算符来实现它。

db.<Collection-Name>.updateOne({
    "_id":ObjectId("55c3043ab165fa6355ec5c9b")
}, {
    "$set": {
        "persons":[
              {
                 "name":"marcus",
                 "contact":"420"
              },
              {
                 "name":"modiji",
                 "contact":"111"
              }
       ]
    }
})
Run Code Online (Sandbox Code Playgroud)

如果要将附加数据推送到数组中,可以使用以下命令。

db.<Collection-Name>.updateOne({
    "_id":ObjectId("55c3043ab165fa6355ec5c9b")
}, {
    "$push": {
        "persons": {
             "name":"sample",
             "contact":"1234"
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

要在单个命令中推送多个对象数组,请使用以下查询

db.<Collection-Name>.updateOne({
    "_id":ObjectId("55c3043ab165fa6355ec5c9b")
}, {
    "$push": {
        "persons": {
            "$each": [
                {
                     "name":"sample1",
                    "contact":"5678"
                },
                {
                     "name":"sample2",
                    "contact":"90123"
                }
            ]
        }
    }
})
Run Code Online (Sandbox Code Playgroud)