通过mongo shell更新mongoDB中的嵌套数组

以下是一个MongoDB文档:

{ "_id" : 2, "mem_id" : M002, "email" : "xyz@gmail.com", "event_type" : [ { "name" : "MT", "count" : 1, "language" : [ { "name" : "English", "count" : 1, "genre" : [ { "name" : "Action", "count" : 6 }, { "name" : "Sci-Fi", "count" : 3 } ], "cast" : [ { "name" : "Sam Wortington", "count" : 2 }, { "name" : "Bruce Willis", "count" : 4 }, { "name" : "Will Smith", "count" : 7 }, { "name" : "Irfan Khan", "count" : 1 } ] } ] } ] } 

我无法更新由于嵌套而更新数组types的字段,特别是event_type,language,genre和cast。 基本上,我想更新所有提到的四个字段以及每个子文档的计数字段。 更新语句应该向树中插入一个值,如果值是新的,else应该增加该值的计数。
什么可以在mongo shell中查询? 谢谢

您直接遇到了MongoDB的当前局限性之一。 问题是引擎不支持多个位置操作符。 请参阅多重使用位置`$`操作符来更新嵌套数组

这是一个开放的门票: https : //jira.mongodb.org/browse/SERVER-831 (也有提到)

你也可以阅读这个关于如何改变你的数据模型: 在MongoDB中更新嵌套数组

如果你可行,你可以这样做:

 db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.0.language.$.count":<number>}}) db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.0.count":<number>}}) 

但是你不能这样做:

 db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.$.count":<number>}}) 

让我们一个接一个地看情况:

  1. 要更新event_type数组中的字段名称:

    db.testnested.update({“event_type.name”:“MT”},{$ set:{“event_type.name”:“GMT”}})

这个命令会把event_type列表中的一个对象的名字更新为MT:

 BEFORE: db.testnested.find({}, {"event_type.name" : 1}) { "_id" : 2, "event_type" : [ { "name" : "MT" } ] } AFTER: db.testnested.find({}, {"event_type.name" : 1}) { "_id" : 2, "event_type" : [ { "name" : "GMT" } ] } 

2.更新event_type内部的字段,例如语言,实体列表的stream派:没有直接的查询。 您需要阅读文档,使用您select的JavaScript或语言更新该文档,然后保存()。 我不认为有任何其他方式可用,直到mongo 2.4

有关更多文档,请参阅save() 。

谢谢!