MongoDB更新深度阵列

JWa*_*lly 6 mongodb

我在名为music的mongo数据库中有以下对象.

我想更新类型是哪里Grunge
乐队名称是Nirvana
专辑名称是Nevermind
音轨顺序是1

并将曲目的名称改为"Smells Like Teen Spirit!".
我已经尝试过使用位置运算符,但无法弄清楚这一点.

{
    genre : "Grunge",
    bands : [ {
        name : "Nirvana",
        albums : [ {
            name : "Nevermind",
            tracks : [ {
                name : "Smell Like Teen Spirit",
                order : 1,
                duration : 301
            },
            {
                name : "In Bloom",
                order : 2,
                duration : 254                                                  
            } ]
        },
        {
            name : "In Utero",
            tracks : [ {
                name : "Server the Servants",
                order : 1,
                duration : 216
            },
            {
                name : "Scentless Apprentice",
                order : 2,
                duration : 254                                                  
            } ]
        } ]
    },
    {
        name : "Karma++ : A Nirvina Tribute Band",
        albums : [ {
            name : "Nevermind",
            tracks : [ {
                name : "Smell Like Teen Spirit",
                order : 1,
                duration : 301
            },
            {
                name : "In Bloom",
                order : 2,
                duration : 254                                                  
            } ]
        },
        {
            name : "In Utero",
            tracks : [ {
                name : "Server the Servants",
                order : 1,
                duration : 216
            },
            {
                name : "Scentless Apprentice",
                order : 2,
                duration : 254                                                  
            } ]
        } ]
    } ]
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*arc 9

不幸的是,目前每次更新只能使用一个"$"位置.这将更新限制为单个嵌入式阵列,类似于文档中的示例:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator (从您的帖子看,它看起来像您已经发现了这个,但我已经包含了链接,以便其他用户阅读这篇文章.)

为了进行更新,您必须知道以下三个中的两个位置:乐队在"乐队"数组中的位置,专辑在专辑阵列中的位置或者曲目的位置在"轨道"数组中.

此功能有一个功能请求,它适用于版本2.3.0(虽然这可能会有所变化).
https://jira.mongodb.org/browse/SERVER-831 "位置运算符匹配嵌套数组"

目前,您必须知道子文档在三个数组中的两个中的位置:

db.music.update({genre : "Grunge", "bands.name" : "Nirvana"}, {$set:{"bands.$.albums.0.tracks.0.name":"Smells Like Teen Spirit!"}})

db.music.update({genre : "Grunge", "bands.0.albums.name" : "Nevermind"}, {$set:{"bands.0.albums.$.tracks.0.name":"Smells Like Teen Spirit!"}})
Run Code Online (Sandbox Code Playgroud)

要么

db.music.update({genre : "Grunge", "bands.0.albums.0.tracks.order" : 1}, {$set:{"bands.0.albums.0.tracks.$.name":"Smells Like Teen Spirit!"}})
Run Code Online (Sandbox Code Playgroud)

  • 似乎他们在2.6.x版中打破了向后兼容性.我的第二个例子(mongodb 2.6.4)得到"位置操作符没有找到查询所需的匹配".它在旧版本中工作正常. (3认同)
  • 这是一个错误,他们批准它,这个答案在mongoDB 2.6中不再有效https://jira.mongodb.org/browse/SERVER-14886 (3认同)