MongoDB - 更新对象数组中的数组

MongoDB - update arrays in object array

本文关键字:数组 对象 更新 MongoDB      更新时间:2023-09-26

我有以下结构:

    {
      data: [
        {pos:"0",
         moreData: ["a", "b"]
        },
        {pos:"1",
         moreData: ["a", "c"]
        },
    ]}

我想通过更新来更新上述结构。我想在更多数据中添加一个字母,其中 pos=1。这是它最后的样子:

    {
      data: [
        {pos:"0",
         moreData: ["a", "b"]
        },
        {pos:"1",
         moreData: ["a", "c", "d"]
        },
    ]}

我现在正在这样做:(使用猫鼬,但无论如何都没问题)

    model.update({"data.pos":"1"},
                 { $push: {data:{ pos:"1", moreData:["d"] } } },
                 { safe: true, upsert: false }, function(err){
    });

我得到的只是一个重复的"pos":"1",其中"moreData"只包含新元素"d"。任何帮助将不胜感激。提前感谢!

这里的问题是您需要推送到正确的数组元素。您可以直接通过点表示法和索引值或使用位置$运算符执行此操作:

 model.update(
     {"data.pos": "1" },
     { "$push": { "data.$.moreData": "d" } },
     function(err, numAffected) {
 })

这应该与"data"数组的选定索引匹配,以便执行更新。但请注意,您有嵌套数组,您将无法匹配和更新内部数组中的项目。请参阅位置操作员文档

您的数据结构有问题,{"data.pos": 1}选择了整个文档(因此$push没有按预期运行):

> db.demo.find({"data.pos": "1"})
{ "_id" : ObjectId("533a850fd15748cc2dc1a17f"), "data" : [  {   "pos" : "0",    "moreData" : [  "a",    "b" ] },    {   "pos" : "1",    "moreData" : [  "a",    "c" ] } ] }

尝试在文档中添加 ID 或其他内容:

> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "id" : "foo", "data" : [    {   "pos" : "0",    "moreData" : [  "a",    "b" ] },    {   "pos" : "1",    "moreData" : [  "a",    "c" ] } ] }
> db.demo.update({"id": "foo"}, {"$push": { "data" : { "pos": "2", "moreData": ["c", "d"]}}})
> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "data" : [  {   "pos" : "0",    "moreData" : [  "a",    "b" ] },    {   "pos" : "1",    "moreData" : [  "a",    "c" ] },    {   "pos" : "2",    "moreData" : [  "c",    "d" ] } ], "id" : "foo" }

似乎做你想做的事。