2

のmongodbデータが与えられた場合

{
    "_id" : ObjectId("552f283dd951e49c6f2f451d"),
    "uuid" : "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
    "sub" : [ 
        {
            "prod" : 30,
            "var" : 0,
            "status" : "Test",
            "files" : [ 
                {
                    "filePath" : "20150415/2-1/21001429153881552f2859699769.82145796.jpg"
                }, 
                {
                    "filePath" : "20150415/2-1/21001429153880552f28589ca9a8.67013013.jpg"
                }
            ]
        }, 
        {
            "prod" : 10,
            "var" : 0,
            "status" : "Pending",
            "files" : []
        }
    ],
    "process_marker" : 3
}

「uuid」が「1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5」、「sub.prod」:10、「sub.prod」の「sub.status」のステータスを更新したいと思います: 0

通常、以下に示すように、結果のインデックスを変更するために「$」を使用します。

use targetDB
db.collection.update({
  "uuid" : "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
  "sub.prod":10,
  "sub.var":0
},{
  "$set":{"sub.$.status":"MyNewValue"}
})

==== BUT THE CODE ABOVE DOES NOT UPDATE THE CORRECT $ TARGET ====

"prod":30, "var":0 セットを更新します...なぜですか?

以下に示すように、2 つのキーと値のペアのクエリ条件を制限すると、正しい配列セットが更新されます

use targetDB
db.collection.update({
  "uuid" : "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
  "sub.prod":10
},{
  "$set":{"sub.$.status":"MyNewValue"}
})

==== THE CODE ABOVE UPDATES THE CORRECT $ TARGET ====

より詳細な検索クエリを使用すると、間違った配列セットが更新されることに混乱しています。これはバグですか、それとも何か間違ったことをしましたか?

MongoDB バージョン: 3.0.2

4

1 に答える 1

4

mongoDBにはバグはありません。クエリの問題は、最初の一致を使用"sub.prod":10"sub.var":0てから更新された場合、最新の値を取得して"sub.var":0最初に一致する配列を取得し、 配列要素"sub.var":0のみを更新したことです。"prod" : 30より多くの参考文献。ここをクリックしてください

この場合、以下の条件でmongo$elemMatchを使用する必要があります$and

db.collectionName.update({
"uuid": "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
"sub": {
    "$elemMatch": {
        "$and": [{
            "prod": 10
        }, {
            "var": 0
        }]
    }
}
}, {
"$set": {
    "sub.$.status": "MyNewValue"
}
})
于 2015-04-20T11:16:55.020 に答える