2015-08-20 41 views
0

我有一個像用戶擁有列表用戶的集合,並且該用戶具有用戶列表。像層次結構。嵌入式文檔更新(嵌套收集)

{   
    "_id" : ObjectId("55530326bc687d21783fd1ff"), 
      "Name" : "User 1", 
      "Role" : "Manager", 
     number:NumberLong(0), 
      "1" : 
     [ 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fd"), 
      "Name" : "User 2", 
      "Role" : "Ass Manager", 
     number:NumberLong(0), 
      "1" : 
     [ 
     ....... 
     ] 
     } 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fq"), 
      "Name" : "User 2", 
      "Role" : "Ass Manager", 
    number:NumberLong(1), 
      "1" : 
     [ 
     ......... 
     ] 
     }, 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fg"), 
      "Name" : "User 3", 
      "Role" : "Ass Manager", 
    number:NumberLong(2), 
      "1" : 
     [ 
     ........ 
     ] 
     } 
     ], 
     "2" : 
     [ 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fw"), 
      "Name" : "User 4", 
      "Role" : "Specialist", 
     number:NumberLong(0), 
      "1" : 
     [ 
     ....... 
     ] 
     } 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fe"), 
      "Name" : "User 5", 
      "Role" : "Specialist", 
    number:NumberLong(1), 
      "1" : 
     [ 
     ......... 
     ] 
     }, 
     { 
     "_id" : ObjectId("55530326bc687d21783fd1fr"), 
      "Name" : "User 6", 
      "Role" : "Specialist", 
    number:NumberLong(2), 
      "1" : 
     [ 
     ........ 
     ] 
     } 
     ] 
     } 

以上只是一個樣本集合,像這樣我有近10000個文檔。我需要找到'數字'爲0的集合。即使任何一個嵌入文檔的'數字'爲0,我也需要該文檔。

注:我不能告訴有多少孩子會來爲用戶。

+0

我認爲你需要一點編輯。你不需要找到「收藏品」,是嗎?你需要找到文件。此外:您是否需要找到它們,或者按照您的標題所示更新它們? –

+0

對不起,如果我知道find查詢,我可以自己創建更新查詢。所以我要求find查詢。 –

+0

這個模式似乎設計得令人費解:)但是,嵌套數組中的元素數量不會成爲問題,但如果您無法確定嵌入的最大級別和密鑰(「 1「,」2「在這裏不是索引,它們是關鍵字以及」名稱「和」角色「) –

回答

0

好的,我會假設你的每個用戶文檔都可以有兩個子用戶數組(即「1」和「2」),並且你有一個最大的嵌套級別,比如3(這意味着嵌套用戶不能超過2個)。順便說一下,the maximum nesting level allowed by mongodb is 100

也許這並不是要你想要的東西:在這種情況下,你必須與你的架構設計問題,因爲

現在,讓我們假裝我的假設對你是好的。嘗試(我打電話您的收藏users,因爲我們通常不會利用集合名稱):

db.users.find({$or:["1.number" : 0, "2.number" : 0, "1.1.number":0, "1.2.number":0, ..., "2.2.1.number":0, "2.2.2.number":0]}) 

我跳過一些你需要添加的組合。注意,你不需要擔心數組中的位置,而且只有3層嵌套,已經有相當多的子句用於運算符,這可能會使你相信最好遵循鏈接的最佳實踐。

對未來讀者的提示:OP在評論中澄清說,他實際上並不需要update,而是find查詢。

+0

感謝你們,我已經按照你們說的一樣。有沒有任何通用的方式來查找,否則我必須改變我的模式設計。 –

+0

答案是否定的,當你不知道密鑰名稱和嵌套級別時,找不到。我真的建議改變scema設計 –

+0

感謝您的幫助,現在我正在努力。 :-( –