【问题标题】:MongoDB: updating an array in arrayMongoDB:更新数组中的数组
【发布时间】:2015-08-27 07:57:57
【问题描述】:

我似乎在访问嵌套在 mongodb 文档中的数组中的数组内容时遇到问题。使用如下查询访问第一个数组“组”没有问题...

db.orgs.update({_id: org_id, "groups._id": group_id} , {$set: {"groups.$.name": "new_name"}});

当我尝试修改嵌套在“group”数组中的数组“features”中元素的属性时,我遇到了麻烦。

这是一个示例文档的样子

     {
        "_id" : "v5y8nggzpja5Pa7YS",
        "name" : "Example",
        "display_name" : "EX1",
        "groups" : [
            {
                "_id" : "s86CbNBdqJnQ5NWaB",
                "name" : "Group1",
                "display_name" : "G1",
                "features" : [
                    {
                        _id      : "bNQ5Bs8BWqJn6CdNa"
                        type     : "blog",
                        name     : "[blog name]"
                        owner_id : "ga5YgvP5yza7pj8nS"
                    }, 
                ]
             },
         ]
     },

这是我尝试使用的查询。

db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "qBX3KDrtMeJGvZWXZ", "groups.features._id":"bNQ5Bs8BWqJn6CdNa" }, {$set: {"groups.$.features.$.name":"New Blog Name"}});

它返回一条错误消息:

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 2,
        "errmsg" : "Too many positional (i.e. '$') elements found in path 'groups.$.features.$.name'"
    }
})

看来mongo不支持通过位置元素修改嵌套在数组中的数组?

有没有一种方法可以修改这个数组,而不用把整个东西拿出来,修改它,然后把它放回去?像这样的多重嵌套是创建新集合的标准做法吗? (即使只有在需要父数据时才需要数据)我是否应该更改文档结构以便第二个嵌套数组是一个对象,并通过键访问它? (其中键是一个整数值,可以充当“_id”)

groups.$.features.[KEY].name

什么被认为是“正确”的做法?

【问题讨论】:

    标签: arrays mongodb object schema


    【解决方案1】:

    经过更多研究,看起来修改数组中的数组的唯一方法是使用一些外部逻辑来找到我想要更改的元素的索引。这样做需要每次更改都有一个查找查询来定位索引,然后是一个更新查询来修改数组。这似乎不是最好的方法。

    Link to a 2010 JIRA case requesting multiple positional elements...

    因为我总是知道该功能的 ID,所以我选择修改我的文档结构。

         {
        "_id" : "v5y8nggzpja5Pa7YS",
        "name" : "Example",
        "display_name" : "EX1",
        "groups" : [
            {
                "_id" : "s86CbNBdqJnQ5NWaB",
                "name" : "Group1",
                "display_name" : "G1",
                "features" : {
                   "1" : {
                           type     : "blog",
                           name     : "[blog name]"
                           owner_id : "ga5YgvP5yza7pj8nS"
                   }, 
                }
             },
         ]
     },
    

    使用新结构,可以通过以下方式进行更改:

    db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "s86CbNBdqJnQ5NWaB"}, {$set: {"groups.$.features.1.name":"Blog Test 1"}});
    

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 1970-01-01
      • 2016-02-09
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多