【问题标题】:Updating nested arrays in mongoDB via mongo shell [duplicate]通过 mongo shell 更新 mongoDB 中的嵌套数组 [重复]
【发布时间】:2013-09-05 13:21:45
【问题描述】:

以下是一个 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
                        }
                    ]
                }
            ]
        }
    ]
}

由于嵌套,我无法更新数组类型的字段,特别是 event_type、语言、流派和演员表。基本上,我想更新所有提到的四个字段以及每个和子文档的计数字段。如果该值是新的,则更新语句应向树中插入一个值,否则应增加该值的计数。
mongo shell 中的查询可以是什么? 谢谢

【问题讨论】:

  • 嗨,如果我想用 {name:'Sport', count:1} 等类型的新值更新上述文档,那么我将如何实现呢?

标签: mongodb


【解决方案1】:

您直接遇到了 MongoDB 当前的限制之一。 问题是引擎不支持多个位置运算符。 看到这个Multiple use of the positional `$` operator to update nested arrays

有一张公开的票:https://jira.mongodb.org/browse/SERVER-831(也有提到)

您还可以阅读这篇关于如何更改数据模型的文章:Updating nested arrays in 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>}})

【讨论】:

    【解决方案2】:

    让我们逐案处理:

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

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

    此命令会将 event_type 列表中的对象名称从 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.更新 event_type 内的字段,例如语言,流派是实习生列表: 没有直接的查询。您需要阅读文档,使用您选择的 JavaScript 或语言更新该文档,然后进行相同的 save()。我认为在 mongo 2.4 之前还有其他方法可以使用

    更多文档,您可以参考save()

    谢谢!

    【讨论】:

    • 当文档可以同时更新时会发生什么?这会导致读取-修改-写入竞争条件吗?
    猜你喜欢
    • 2021-07-20
    • 2017-01-13
    • 2019-02-20
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多