2013-07-22 120 views
1

我顯然不明白我如何更新/插入現有文檔中的子文檔。 我試過如下:更新/插入子文檔mongodb

 query = aCollection.find_one({stuffToFind}) 
     aCollection.update(query, 
         {"$set": {"subDoc" : {"1" : String, "2" : datetime.datetime.now(), "3" : otherString}}}) 

這僅適用一個時間,但我要不斷地改變subdoc的的數據1,2,如果執行該代碼3。 find_and_modify也失敗了,因爲它似乎覆蓋了整個文檔刪除所有其他字段,但id和更新中指定的字段。 由於我對MongoDB相當陌生,如果有人能夠給我一個代碼示例如何找出我的問題,那就太好了。

編輯:沒有「$組」聲明它仍然保持不變,以及在第二執行..

EDIT2:這看似沉綿我無法編輯受影響(JSON )直接在文檔中MonjaDB了:d

aCollection.update(query(but this time not as a variable), 
         {"$set" : {"subDoc.1" : Sting, "subDoc.2" : datetime.datetime.now(), "subDoc.3" : otherString}}) 

我不知道,爲什麼這工作,所以也許有人可以解釋我做錯了什麼..

由於在dvance,

Codehai

回答

1

您提供在第一個例子,以更新查詢是不正確的,而不是:

query = aCollection.find_one({stuffToFind}) 

你應該有:

query = {stuffToFind} 

的原因,更新不會拋出錯誤的是find_one的結果是一個字典。還要注意的是,有時候上述內容甚至會起作用,因爲在更新中,您實際上是要求MongoDB匹配與最初的 查詢對應的整個文檔。在這種情況下,當然查詢的後續使用將不會帶來預期的結果,因爲文檔將從更新中更改。

$集只更新我們指定的所有其他鍵不變的鍵。這意味着如果我們更新嵌入式對象,那麼整個嵌入式對象將被替換爲我們在$ set中指定的內容。如果我們想要精確定位嵌入對象 中的鍵,我們必須像在第二個例子中那樣使用點符號。

+0

非常感謝解釋! – Codehai