2012-04-26 97 views
6

我在蒙戈数据库中的下列对象命名的音乐。

我想更新其中的体裁是垃圾
乐队的名字是涅槃
专辑名称是没关系
轨道顺序1

MongoDB的更新深阵列

和改变轨道的名称为“气味喜欢青少年的精神!”。
我试着位置运营商打,但不能很 摸不着头脑。

{ 
    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             
      } ] 
     } ] 
    } ] 
} 
+0

你有没有考虑过改变你的数据库设计?如果你的文档是一个带'流派'属性的'乐队',那么也许会更有意义 - 并且会使这个特定的查询变得更容易。 – Russell 2012-04-26 21:35:01

+0

这只是我能想到的最快的例子。如果我真的要做一个'音乐'数据库,那么我可能会将歌曲作为以艺术家,专辑和流派为阵列的根源;允许像大卫鲍伊/女王的'压力不足'(2名艺术家,多张专辑)。 – JWally 2012-04-26 22:04:53

回答

9

不幸的是,目前每次更新只能使用一个“$”位置。这限制了更新到一个嵌入式阵列,类似于文档中的例子:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator (从您的文章,看起来你已经发现了这一点,但我已经包括阅读这篇文章的链接,其他用户的利益)

为了进行更新,您需要知道以下三项中的两项的位置:乐队在“bands”数组中的位置,专辑在专辑阵列中的位置,或轨道在“轨道”阵列中的位置。

有这个功能的特征请求,并且它被提名为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!"}}) 

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

似乎他们在版本2.6.x中打破了向后兼容性。对于第二个例子(mongodb 2.6.4),我得到“位置运算符没有从查询中找到所需的匹配项”。它在旧版本中工作正常。 – bersam 2014-08-13 11:19:33

+3

这是一个错误,他们批准它,这个答案在mongoDB 2.6中不再有效https://jira.mongodb.org/browse/SERVER-14886 – bersam 2014-08-14 07:38:42