2012-02-09 14 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]' 
         } 
        ] 
      } 
     ] 
} 

1つのドキュメントをキャンペーンの配列のメッセージ配列に(注文に関係なく)プッシュしたいとします。つまり、新しい文書をメッセージの配列に追加する必要があります。これらのメッセージはすべて、別の配列内またはユーザーごとのキャンペーンからのものです。私のコードはこのようになるので、私は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

感謝を:あなたはを通じて特定のキャンペーンのメッセージ配列にプッシュすることができ、言っ

。それはうまくいった。はい、私はあなたに同意します、アレイ内部の配列は悪い考えです。今私のコードから見ることができます。ちょっと面倒です。 :( –

+1

はい、もっと重要なのは、複数の位置演算子($)を使用できないため、配列全体を上書きせずにメッセージを編集することはできません。ここで修正してくださいhttps://jira.mongodb.org/browse/SERVER- 831 –

+0

ああ、これは今私が探しているものです。私は、複数の位置演算子を使用する方法があるので、私はそれを使用できないことを確認します。文字列フィールド名[$]コード:13048 503ms。ありがとう。:) –

関連する問題