2012-06-15 72 views
2

在我的MongoDB中,我有Document1,如下所示。我想到達「main.accounts」(及後面的「main.entries」)文檔,並更新($ set)「content」數組中的整個子文檔。到目前爲止,我的子文檔已經能夠在「內容」子數組中添加和刪除文檔,但是在這種情況下,我想更新整個文檔;而不僅僅是更新($ set)匹配文檔中的一個屬性。我試過只用$ set,$ set用$ elemMatch,而且我也試過findAndModify,但是無濟於事。當然,我有我)RTFM,看着周圍的所有人ii)互聯網及iii)SO,找到解決的辦法。任何人都已經能夠以這種方式來更新整個文檔?

感謝 添

更新嘗試1 - 這是唯一可行的更新,而是將整個「內容」數組到哈希... {「福」:「酒吧」}

 

    db.bookkeeping.update(
     { 
     owner : "[email protected]", 
     "content.content.tag" : "account", 
     "content.content.id" : "one" 
     }, 
     { $set : { "content.$.content" : { "fu" : "bar" } } } 
    ) 

更新嘗試2 - 這並不失敗,但不更新有問題的文檔

 

    db.bookkeeping.update(
     { 
     owner : "fu", 
     thing : { $elemMatch : { "content.content.tag" : "account", "content.content.id" : "one" } } 
     }, 
     { $set : { "thing" : { "fu" : "bar" } } } 
    ) 

更新嘗試3 - 這並沒有失敗,但在問題

012不更新文檔
 

    db.bookkeeping.update(
     { thing : { $elemMatch : { owner : "fu" , "content.content.tag" : "account", "content.content.id" : "one" } } }, 
     { $set : { "thing.content.content.$" : { "fu" : "bar" } } } 
    ) 

文檔1

 

    { 
      "_id" : "fid", 
      "content" : [ 
        { 
          "content" : [ 
            { 
              "id" : "one", 
              "tag" : "account" 
            }, 
            { 
              "id" : "two", 
              "tag" : "account" 
            }, 
            { 
              "id" : "three", 
              "tag" : "account" 
            }, 
            { 
              "id" : "four", 
              "tag" : "account" 
            }, 
            { 
              "id" : "five", 
              "tag" : "account" 
            } 

          ], 
          "id" : "main.accounts", 
          "tag" : "accounts" 
        }, 
        { 
          "tag" : "journals", 
          "id" : "main.journals", 
          "content" : [ 
            { 
              "tag" : "journal", 
              "id" : "generalledger", 
              "name" : "generalledger", 
              "type" : "", 
              "balance" : "", 
              "content" : [ 
                { 
                  "tag" : "entries", 
                  "id" : "main.entries", 
                  "content" : [ ] 
                } 
              ] 
            } 
          ] 
        } 
      ], 
      "owner" : "fu", 
      "tag" : "fubar" 
    } 

+0

要更新哪個文檔。這個問題困惑。你爲什麼一直在討論更新($ set)? – c0deNinja

+0

我試圖更新對象:'{「id」:「one」,「tag」:「account」}'。我的意思是在功能上,我想更新所述文件。我試圖用$ set操作符來做到這一點。心連心。 – Nutritioustim

回答

1

您將無法使用位置操作$用於更新數組的第二個層次。(陣內陣)

This link可以幫助你

+0

嘿拉維,感謝'$'位置算子的見解。但是當更新一個值時,該鏈接僅顯示更新散列的單個成員,如...... **名稱:「聞起來像青少年的精神!!」**。我無法更新整個文檔,比如'{name:「味道像青少年的精神!!」,順序:1,持續時間:301}'。我可以用** $ set **來做到這一點嗎?謝謝。 – Nutritioustim

+1

好吧,我通過硬編碼查詢和更新路徑中的陣列位置來解決這個問題。那個鏈接讓我知道解決方案,所以謝謝。所以我有類似下面的東西(Clojure代碼調用mongodb):'(mc/update「bookkeeping」{:owner uname「content.1.content.0.content.0.content.tag」「entry」} {mop/$ set {:content.1.content.0.content.0.content。$ entry}})'。是我嗎,還是MongoDB的更新語義確實錯綜複雜,解釋不當?無論如何,謝謝。 – Nutritioustim

-1

我相信你不能在沒有編程邏輯的情況下在mongoDB控制檯中這樣做,因爲你在你的結構中使用了多個數組,並且你正在搜索g爲一個數組中的子文檔(內容[文檔])(main.accounts和main.entries),它將返回相同的根文檔,但是在那個返回值中,你無法知道內容數組中的什麼位置是你的標準。正因爲如此,你不能在正確的位置注入新的值。

如果可能的話,我會建議重構文檔以避免嵌套數組太多(內容 - >內容 - >內容 - >內容),特別是如果您打算對其子集進行一些更新。畢竟這是NoSQL,因此可以在設計中使用一些冗餘數據,只要這樣可以讓您的生活更輕鬆,代碼更乾淨。

+3

沒錯。所以這個練習教給我的一件事是,除了非常扁平的結構之外,NoSQL可能不適用於其他任何東西。看起來它不應該超過1級。我不接受在任何現代數據服務中,在文檔中的任何位置更新某些內容應該很困難。此外,[JQuery選擇器](http://api.jquery.com/category/selectors/)(甚至[XQuery](http://en.wikipedia.org/wiki/XQuery))已經解決了這個問題現在一會兒。所以不,我不傾向於重構我的文檔來安撫MongoDB限制。 – Nutritioustim

+0

@golja這不就是NoSQL文檔驅動的數據結構嗎?能夠嵌套的東西,所以我們不必在各地收藏品?我同意營養補充劑 – k00k