2014-11-04 196 views
4

考慮以下文件:MongoDB的更新深度嵌套陣列

{ 
    "comments": [ 
     { 
      "id" : 1, 
      "userid": "john", 
      "comment": "lorem ipsum...", 
      "responses": [ 
       { 
        "id" : 2, 
        "userid": "smith", 
        "comment": "lorem ipsum...", 
        "responses": [ 
         { 
          "id" : 3, 
          "userid": "random", 
          "comment": "lorem ipsum...", 
          "responses": [] // I want to push a comment into this array 
         }, 
         { 
          "id" : 4, 
          "userid": "guy", 
          "comment": "lorem ipsum..." 
         } 
        ] 
       }, 
       { 
        "id" : 5, 
        "userid": "adam", 
        "comment": "lorem ipsum..." 
       } 
      ] 
     } 
    ] 
} 

是否有推文檔轉化爲一個responses陣列什麼辦法?因此,在這種情況下,用戶想評論3級評論,並且我想將該評論推送到數組中。我可以在發表評論時將陣列位置發送給用戶並返回服務器,但我很確定這不可靠。另外,如果在這之間發生刪除(我猜(?)),陣列中的位置會發生變化,所以這實際上是一個不行。

+0

任何時候我需要更新/編輯一個文件我使用Robomongo。它的快速和容易 – gpullen 2014-11-04 15:19:21

+0

那麼這並不能真正解決我的問題。 – Andrew 2014-11-04 15:56:58

+0

您是否需要通過編寫命令來更新文檔? – gpullen 2014-11-04 15:58:43

回答

1

如果你知道索引的順序趴下去這個水平,那麼是:

> db.test.update({ ... }, { "$push" : { "comments.0.responses.0.responses.0.responses" : "this is my response" } }) 

的0的是索引。但是,像這樣的多重嵌套結構幾乎肯定是一個不好的數據建模選擇。你應該考慮其他選擇。 modeling tree structures上的文檔可能會有幫助嗎?

+0

由於它是一個Web應用程序,我不會依賴索引,任何事情都可能發生。我不確定,但我應該如何改造它。我唯一需要的是能夠在每個級別按日期字段排序註釋(它不在原始問題中)。我猜我應該使用一個數組,然後用父ID推送所有註釋,然後在應用程序級別執行其餘的操作。但是,如果您有任何其他建議(更好?),我會開放。 (或者使用聚合框架,但是更好的性能呢?) – Andrew 2014-11-06 02:22:23