0

mongodb でネストされたサブドキュメントを更新しようとしていますが、

  {
id: 100, 
     status: [ { 

                 campaigns: [ 
                    { timestamp: "2014-07-30", 
                      task: [
                                { 
                                  id: "1",
                                  created: "2014-07-30"
                                } 

                        ]
                    }, 
                    { timestamp: "2014-07-31", 
                      task: [
                                { 
                                  id: "2",
                                  created: "2014-07-31" // need to update this field
                                } 

                        ]
                    }, 
                ]
            }, 
        ]

    }

クエリを更新

db.collectionname.update({"id": 100,"status.campaigns.task.id":"2"},{$set:{"status.0.campaigns.$.task.created:"2014-08-01"}});

上記のクエリは、最初のレコード (task.id = "1" 作成日) のみを更新し、task.id="2" サブドキュメントを更新しません!!!!

4

2 に答える 2

0

サブ文書を更新することはできますが、文書構造内にあるさまざまなネストされた配列内での位置を知る必要があります。idこれは、たとえば、ネストされた配列に挿入するサブドキュメントのフィールドに対して特定の番号付けスキームに従っている場合に当てはまります。

それが実行可能な戦略である場合、update()最初の引数に 2 番目のキーと値のペアは必要ありません。これは、更新するサブドキュメントを含むドキュメントを探しているだけで、_idフィールドが一意であるためです。2 番目の引数には、ネストされた配列内のサブドキュメントの位置に使用するインデックスを使用します。

配列の最初の要素の配列の2 番目の要素で配列の最初の要素のcreatedフィールドを更新している投稿例のドキュメントの場合、次のようにします。taskcampaignstatus

db.collection.update({ "_id": 100}, { $set: { "status.0.campaigns.1.task.0.created" : "2014-08-01" }});

ただし、更新するサブ文書の位置がわからない場合は、更新できません。これは、ドキュメントで説明されているように、「複数の配列をトラバースするクエリには位置演算子を使用できない」という事実によるものです。

于 2014-07-31T14:27:44.240 に答える