通过MongoShell更新mongoDB中的嵌套数组

通过MongoShell更新mongoDB中的嵌套数组,mongodb,Mongodb,以下是MongoDB文档: { "_id" : 2, "mem_id" : M002, "email" : "xyz@gmail.com", "event_type" : [ { "name" : "MT", "count" : 1, "language" : [ { "name" : "English

以下是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
                        }
                    ]
                }
            ]
        }
    ]
}
由于嵌套,我无法更新数组类型的字段,特别是事件类型、语言、流派和类型转换。基本上,我想更新所有提到的四个字段以及每个文档和子文档的count字段。如果值是新的,update语句应该向树中插入一个值,否则应该增加该值的计数。
mongo shell中的查询可以是什么?
谢谢

您直接触及了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({u id:2,“event\u type.name”:'MT',“event\u type.language.name”:'English'},{$set:{“event\u type.0.language.$.count”:})
db.collection.update({u id:2,“event\u type.name”:'MT',“event\u type.language.name”:'English'},{$set:{“event\u type.$.language.0.count”:})
但你不能这样做:

db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.$.count":<number>}})
db.collection.update({u id:2,“event\u type.name”:'MT',“event\u type.language.name”:'English'},{$set:{“event\u type.$.language.$.count”:})

让我们逐一考虑:

  • 要更新事件类型数组中的字段名,请执行以下操作:

    db.testnested.update({“event\u type.name”:“MT”},{$set:{“event\u type.name”:“GMT”})

  • 此命令将事件类型列表中对象的名称从MT更新为GMT:

    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.要更新事件类型内的字段,如实习生列表中的语言、类型: 对此没有直接的疑问。您需要阅读文档,使用您选择的JavaScript或语言更新该文档,然后保存()相同的内容。我认为在mongo 2.4之前没有其他可用的方法

    有关更多文档,请参阅


    谢谢

    您好,如果我想用{name:'Sport',count:1}等类型的新值更新上述文档,那么我将如何实现它?当文档可以同时更新时会发生什么情况?这将导致读-修改-写竞争条件否?