如何更新mongodb中的嵌套对象

时间:2016-01-03 19:32:52

标签: mongodb mongoose

我是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个级别。我接受了答案,解释说它不受支持,并提供了正确的解决方法。

1 个答案:

答案 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
   } 
});