2014-04-14 32 views
0

的陣列拉我有一個集合MongoDB的 - 從對象

{ 
    "_id" : ObjectId("534bae30bf5049a522e502fe"), 
    "data" : [ 
      { 
        "0" : { 
          "content" : "1", 
          "type" : "text", 
          "ident" : true 
        }, 
        "1" : { 
          "content" : "", 
          "type" : "text", 
          "ident" : false 
        } 

      }, 
      { 
        "0" : { 
          "content" : "2", 
          "type" : "text", 
          "ident" : true 
        }, 
        "1" : { 
          "content" : "", 
          "type" : "text" 
        } 
      } 
    ] 

}

content是獨一無二的。

我將如何刪除匹配content: '2'的對象?

我已經試過這樣:

data:{$pull:{"content": deletions[i]}} 

其中deletions [i]是內容。

和幾個變化,但我不能得到它的工作。我錯過了什麼?

+0

你可能從PHP傾倒這個?或者你的內容在mongo shell中看起來像這樣嗎? –

+0

它從外殼看起來像這樣。我應該擔心這個嗎? – user2422960

回答

1

根據你的評論,你應該擔心。我已經多次在PHP應用程序中看到過這種情況(並且PHP在轉儲數組中有這種有趣的表示法)。

問題是像「0」和「1」這樣的元素本身創建子文檔,而不是將所有內容都作爲子文檔作爲數組成員,遇到訪問數組的單個成員的問題,因爲所使用的路徑需要是「絕對的」。

因此,這實際上「強制」沒有其他可能的選項通過什麼是等效的「點符號」形式訪問元素。除了在這種情況下,它不僅僅是數組的「第n個」元素,而是您需要解決的實際路徑。

但如果這樣做實際上是爲你工作,而它似乎是「有人」試圖避免 與「嵌套」的陣列下位置更新的問題(詳見positional $操作文檔),那麼你更新可以像這樣進行:

的基本語句如下:

db.collection.update(
    { 
     "data.0.context": 2 
    }, 
    { 
     "$pull": { "data.$.0.context": 2 } 
    } 
) 

但這「似乎」是一個有點滑稽的方式來寫這篇文章,但調查的實際結構你有,那麼你應該能夠看到爲什麼這是需要的原因。基本上,這符合使用位置$運算符的要求來指示數組中第一個匹配元素的索引(又名「數據」),然後使用標準子文檔表示法來指定要更新元素的路徑。

所以這當然會造成一個問題,如果元素實際上處於未知位置。但需要考慮的是,考慮到記錄的限制,陣列的使用對您來說實際上很重要?如果喲需要匹配「內部」元素的位置,則更改結構以將數組放在那裏。

但始終了解限制的影響,並嘗試根據引擎的實際功能進行建模。