2013-01-12 45 views
0

我想嘗試向數組添加更多值,但是因此必須匹配兩個值。我得到它與一個價值工作,但不與兩個。這是我有:MongoDB - 使用python更新

{ "_id" : ObjectId("50f1a05d00bf6832b03a01cb"), 
    "app" : "494258956", 
    "keywords" : [ 
    { "data" : [ 
     { "device" : "software", 
      "date" : Date(1358012509633), 
      "rank" : 1, 
      "shop" : "143443" } ], 
     "keyword" : "test" } ] } 

當我有一個新的「數據」關鍵字「測試」和應用程序「494258956」,那麼新的一組應該被添加到「數據」,並期待這樣的:

{ "_id" : ObjectId("50f1a05d00bf6832b03a01cb"), 
    "app" : "494258956", 
    "keywords" : [ 
    { "data" : [ 
     { "device" : "software", 
      "date" : Date(1358012509633), 
      "rank" : 1, 
      "shop" : "143443" } 
, { "device" : "software", 
      "date" : Date(1358012599633), 
      "rank" : 2, 
      "shop" : "143443" }], 
     "keyword" : "test" } ] } 

在此先感謝。

+1

檢出$ push operator http://docs.mongodb.org/manual/reference/operator/push/ –

回答

0

這似乎做什麼你問(JavaScript語法):

coll.update({ 
     "app": "494258956", 
     "keywords": { 
      "$elemMatch": { "keyword": "test" } 
     } 
    }, 
    { 
     "$push": { 
      "keywords.$.data": { 
       "device" : "software", 
       "date" : new Date(1358012599633), 
       "rank" : 2, 
       "shop" : "143443" 
      } 
     } 
    } 
+0

謝謝。它適用於關鍵字是否存在,但如果不存在並且必須插入數據集則不適用。我只是得到一個$。你知道一個解決方案如何工作嗎? – user1972788

+0

我很確定這對於「upsert」操作來說太複雜了。我認爲您需要測試更新結果,並在找不到該項目時執行插入操作。 – mjhm

0

目前,這是不支持 - 因爲位置操作$目前不與UPSERT工作。請投票SERVER-3326

解決方法可能是重新審視架構設計或多個操作(您不使用upsert) - 並檢查更新的項目數。你要小心不要打了一個競爭條件如:

  1. 請在{keywords: {$exists: true}}
  2. 如果更新返回0的更新 - 沒有關鍵字執行UPSERT:其中{keywords: {$exists: false}}
  3. 如果更新返回0 - 有一場比賽和有人添加關鍵字現在可以執行步驟1.