更新子子数组mongodb

时间:2017-08-21 09:34:17

标签: mongodb

我在收藏清单中的文件:

    {
        "_id" : ObjectId("599a910be15dad0b144363d7"),
        "createdAt" : ISODate("2017-08-21T07:51:39.987Z"),
        "updatedAt" : ISODate("2017-08-21T07:51:39.987Z"),
        "title" : "List",
        "mainCats" : [ 
            {
                "mainCatId" : "1",
                "title" : "Cars",
                "_id" : ObjectId("599a910be15dad0b1443650d"),
                "subs" : [ 
                    {
                        "subId" : "1.1",
                        "title" : "Tires",
                        "_id" : ObjectId("599a910be15dad0b1443653c"),
                    }
               ]
         }
      ]
}

子数组中的标题(“轮胎”)应该由subId(1.1)作为标准更新。

类似的东西:

db.list.update(
    {
        '_id' : ObjectId("599a910be15dad0b144363d7"),
        'mainCats.subs.subId' : '1.1'
    },

    {
        $set : {
            'mainCats.subs.title' : 'New title',
        }
    }
)

无法让它发挥作用。

2 个答案:

答案 0 :(得分:0)

您必须使用positional operator $。但遗憾的是,此运算符无法应用两次,因此无法遍历子数组。它代表更新查询的第一次匹配,因此您无法将其用于多次更新。 如果您需要更新一个子文档(据我在查询中看到,您拥有子文档的ID),您可以通过重新定义下面的数据结构来实现目标:

description

因此您可以更新一个文档(首先匹配查询),如下所示:

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk/System/Library/Frameworks/IOKit.framework

答案 1 :(得分:0)

也许这很晚了,但是因为我在SO上找到了这个答案,但是我发现这个operator对我有用。

db.list.update(
    { '_id' : ObjectId("599a910be15dad0b144363d7") },
    { $set: {"mainCats.$[].subs.$[category].title: 'New title' },
    { arrayFilters: [ {"category.subId": "1.1"} ]
)

文档应该比我可能做的要有用,但仅仅是为了帮助其他也达到此职位的人。

无论如何,唯一明显的区别是与subArray对应的条件现在处于arrayFilters条件下。在那里,您可以看到我们使用了上面给出的标识符,而不是使用属性的实际名称。

第二个区别是$ []运算符。根据{{​​3}}

的运算符
  

所有位置运算符$ []指示更新运算符应修改指定数组字段中的所有元素。

与$ [category]之间的唯一区别是,我们为每个元素提供了一个标识符,以便我们轻松识别它们。

希望这会有所帮助。