我在收藏清单中的文件:
{
"_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',
}
}
)
无法让它发挥作用。
答案 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]之间的唯一区别是,我们为每个元素提供了一个标识符,以便我们轻松识别它们。
希望这会有所帮助。