2011-10-19 74 views
2

我使用Codeigniter和Alex Bilbie的MongoDB庫。 在我開發的API中,用戶可以上傳圖片,其他用戶可以對其進行評論。 我已選擇將評論作爲子文檔添加到圖像中。使用MongoDB的多個原子更新?

每個註釋包含:

  • 全名(作者)
  • 評論
  • Created_at

所以,換句話說。用戶全名是「硬編碼」到每個評論,所以如果他們 後來決定改變他們的名字,我有一個問題。

我讀過我可以使用原子更新來更新名稱的所有匹配項(比如在註釋中),但我怎樣才能使用Alex的庫來做到這一點?我可以更新名稱錯誤的所有地方嗎?

UPDATE

這是圖像文件的樣子與評論。 我認爲這很奇怪,MongoDB鼓勵使用子文檔,但不包括更新數組中多個項目的方法。

{ 
    "_id": ObjectId("4e9ead773dc793dc01020000"), 
    "description": "An image", 
    "category": "accident", 
    "comments": [ 
     { 
      "id": ObjectId("4e96bd063dc7937202000000"), 
      "fullname": "James Bond", 
      "comment": "This is a comment.", 
      "created_at": "2011-10-19 13:02:40" 
     } 
    ], 
    "created_at": "2011-10-19 12:59:03" 
} 

感謝您的幫助!

回答

1

我不熟悉codeignitor,但MB MongoDB的shell語法將幫助您:

db.comments.update({"Fullname":"Andrew Orsich"}, 
        { $set : { Fullname: "New name"} }, false, true) 

最後一個真正的標誌表明您要更新多個文檔。因此可以在一次更新操作中更新所有註釋。

BTW:mongodb和nosql中的數據一般是denormalazing(不是'硬編碼')數據。還需要更新許多文件的操作通常工作異步。但這取決於你。

更新:

db.comments.update({"comments.Fullname":"Andrew Orsich"}, 
        { $set : { comments.$.Fullname: "New name"} }, false, true) 

但是,上面的語句將更新嵌套陣列上的第一個評論的全名。如果您需要影響對多個數組元素的更改,則需要使用多個更新語句。

+0

謝謝!我用一個例子更新了我的問題。我如何使用該ID訪問和更改評論並使用該結構? –