【问题标题】:MongoDB - update arrays in object arrayMongoDB - 更新对象数组中的数组
【发布时间】:2017-06-26 20:06:22
【问题描述】:

我有以下结构:

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

我想通过更新来更新上述结构。我想在 pos=1 的 moreData 中添加一个字母。最后应该是这样的:

    {
      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”。 任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: javascript node.js mongodb mongodb-query database


    【解决方案1】:

    这里的问题是你需要推送到正确的数组元素。您可以通过点符号和索引值直接执行此操作,也可以使用 positional $ 运算符:

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

    这应该匹配“数据”数组的选定索引才能执行更新。但请注意,您有嵌套数组,您将无法匹配和更新内部数组中的项目。请参阅位置运算符文档

    【讨论】:

    • 感谢您的快速回复!我已经尝试过您的解决方案,但它没有向数据库添加任何内容。我认为,正如您已经提到的,您不能将 $ 用于嵌套数组。
    • @user881387 您的实际数据与问题不同吗?这确实适用于您提供的数据。您可以将 $ 用于嵌套数组,但它只匹配 first 元素,这就是这种情况下所需要的全部。只有当您想将“moreData”中的“c”元素更改为“b”时,它才会成为问题。在那里你不能匹配 两个 数组索引。但是像上面这样的 $push 操作并没有什么问题。
    • @user881387 尝试在 cmets 中发布并不是最好的,因为它很难阅读。但你似乎在问一些与你的问题不同的东西。答案已针对您的问题给出,如果您还有其他问题,请发布另一个问题。给定的语句在给定的条件下将“d”元素添加到您的数组中。
    • 我的错......我实际上是在做 { "$push": { "data.$.pos": "d" } } 它有效! :)
    【解决方案2】:

    你的数据结构有问题,{"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" }
    

    似乎做你想做的事。

    【讨论】:

    • 感谢您的快速回复。正如您在解决方案中建议的那样,您正在向第一级数组添加一个新的“pos”。我想添加一个新数据到现有“pos”的“moreData”数组中。
    • 看看 Neil 的解决方案是否有效。 mongoDB 中的嵌套数组可能很乱(我想是否有办法解决它!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多