2012-04-26 159 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