2012-05-13 76 views
1

我需要幫助參與者中的所有密鑰遞增值,而不必知道密鑰的名稱。

> db.conversations.findOne() 

{ 
"_id" : ObjectId("4faf74b238ba278704000000"), 
"participants" : { 
    "4f81eab338ba27c011000001" : NumberLong(2), 
    "4f78497938ba27bf11000002" : NumberLong(2) 
} 
} 

我已經嘗試過的東西像

$mongodb->conversations->update(array('_id' => new \MongoId($objectId)), array('$inc' => array('participants' => 1))); 

無濟於事......

回答

2

您需要重新設計架構。擁有「隨機密鑰名稱」永遠不是一個好主意。儘管MongoDB是無模式的,但它仍然意味着您需要定義關鍵名稱。您應該將模式更改爲:

{ 
    "_id" : ObjectId("4faf74b238ba278704000000"), 
    "participants" : [ 
     { _id: "4f81eab338ba27c011000001", count: NumberLong(2) }, 
     { _id: "4f78497938ba27bf11000002", count: NumberLong(2) } 
    ] 
} 

可悲的是,即便如此,你不能在一個命令更新所有的嵌入式計數。目前對於開放式的功能要求:https://jira.mongodb.org/browse/SERVER-1243

爲了還更新了一切,你應該:

  • 查詢文檔
  • 更新所有客戶端上的計數
  • 店再次提交文件

爲了防止與此相關的競爭條件,請看"Compare and Swap"及以下段落。

+0

好吧,我已根據您的示例更新了架構和所有方法,但是當通過運行上面的錯誤消息執行更新時,會顯示「can not append to array using string field name [count]」。 – Sputnik

+0

你說得對。有一個這樣的Jira票:https://jira.mongodb.org/browse/SERVER-1243請投票!我已經更新了我的答案。 – Derick