2012-02-09 85 views
2

即時通訊新的與mongo和迄今沒有使用它的問題。直到我堅持這一點。我需要將文檔推送到數組中的數組。可以參考下面的json。Mongo推到數組陣列

{ 
    'user_id':'{1231mjnD-32JIjn-3213}', 
    'name':'John', 
    'campaigns': 
     [ 
      { 
       'campaign_id':3221, 
       'start_date':'12-01-2012', 
       'messages': 
        [ 
         { 
          'message_id':211134, 
          'email':'[email protected]' 
         } 
        ] 
      }, 
      { 
       'campaign_id':3222, 
       'start_date':'13-01-2012', 
       'messages': 
        [ 
         { 
          'message_id':315521, 
          'email':'[email protected]' 
         } 
        ] 
      } 
     ] 
} 

我想將一個文檔推送到廣告系列陣列中的一組消息(無論排序如何)。這意味着,我需要將新文檔附加到一組消息中。所有這些消息都來自另一個陣列或每個用戶的廣告系列。我使用Python,所以我的代碼將是這樣的。

query = {"user_id" : "{1231mjnD-32JIjn-3213}", "campaigns.campaign_id": 3221} 
message = {"message_id":4213122, "email":"[email protected]"} 
op = {"$push" : {"campaigns.messages":message}} 
mongo.TestDatabase.members.update(query, op) 

執行時沒有錯誤。但文件似乎沒有變化(沒有更新)。我在這裏做錯了什麼?

回答

2

由於多種原因,數組中的數組幾乎總是一個壞主意。我會把這些活動放在一個專門的集合中,以便它們成爲頂級文檔。

也就是說,你可以通過推到一個特定活動的消息數組:

db.members.update(
    {"user_id" : "{1231mjnD-32JIjn-3213}", "campaigns.campaign_id": 3221}, 
    {$push:{"campaigns.$.messages":{"message_id":4213122, "email":"[email protected]"}}} 
) 
+0

感謝您的解決方案。它確實有效。是的,我同意你的觀點,陣列內數組是一個壞主意。我現在可以從我的代碼中看到它。它有點凌亂。 :( – 2012-02-09 14:23:13

+1

是的,更重要的是,如果不允許使用多個位置運算符($),則不能編輯消息而不覆蓋整個數組。在此修復此問題https://jira.mongodb.org/browse/SERVER- 831 – 2012-02-09 14:38:52

+0

啊,這就是我剛纔搜索的東西,我看有沒有什麼方法可以使用多個位置操作符,所以它確認我們不能使用它,並且我得到這個異常:異常:不能附加到數組字符串字段名稱[$]代碼:13048 503ms。非常感謝。:) – 2012-02-09 16:19:08