我是mongodb和自学的新手。从最近我有点卡在这一个。我想更新一个嵌套文档。我通过检索完整的文档并更新整个文件来解决这个问题,但我需要一个可以一次更新的解决方案。我做了以下简化示例:
db.test.insert({
'name': 'someSchool',
'classes': [
{
'name': 'someClass',
'students': [
{
'name': 'Jack',
'coolness' : 7
}
]
}
]
});
这里为了简单起见,数组只有一个条目,你知道我们通常有更多......
db.test.find({
'name' : 'someSchool',
'classes' : {
$elemMatch: {
'name': 'someClass',
'students.name' : 'Jack'
}
}
});
这个发现有效!多数民众赞成,所以现在我想在更新中使用它,这是我卡住的地方。像这样的东西?
db.test.update({
'name' : 'someSchool',
'classes' : {
$elemMatch: {
'name': 'someClass',
'students.name' : 'Jack'
}
}
}, {
'$set' : { 'classes.students.coolness' : 9}
});
所以这不起作用,现在我被卡住了:)希望有人在这里可以提供帮助。
旁注:我正在使用猫鼬。如果你们告诉我,更好地改变架构以使其更容易,我可以。
自标记为重复后更新:在引用的问题中,只有1级嵌套,问题通过使用点表示法得到解决。这里有2个级别。我接受了答案,解释说它不受支持,并提供了正确的解决方法。
答案 0 :(得分:1)
正如前面提到的here,现在不可能更新两个级别的嵌套数组。
我建议你更改你的模式,以便用对象替换一个级别的数组嵌套。所以你的文件看起来像这样:
{
"name" : "someSchool",
"classes" : {
"someClass" : {
"students" : [
{
"name" : "Jack",
"coolness" : 7
}
]
}
}
}
然后您可以使用positional operator更新特定的数组元素。但请注意,位置运算符仅更新数组中与查询匹配的第一个元素。
更新查询将如下所示:
db.test.update({
'classes.someClass.students' : {
$elemMatch: {
'name' : 'Jack'
}
}
}, {
'$set' : {
'classes.someClass.students.$.coolness' : 9
}
});