Что-то не так с индексом '$' для обновления данных mongodb

Учитывая данные 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
}

Я хотел бы обновить статус "sub.status", где "uuid": "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5", "sub.prod":10, "sub.prod":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 set... Почему это так?

Если мы ограничим условия запроса для двух пар ключ-значение, как показано ниже, правильный набор массивов будет обновлен

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

1 ответ

В mongoDB ошибки нет, проблема в том, что вы использовали первое совпадение "sub.prod":10 а потом "sub.var":0 но в обновленном он принимает последнее значение в вашем случае "sub.var":0 берет и сопоставляет первый соответствующий массив, где "sub.var":0 вот почему он обновился только "prod" : 30 элемент массива. Больше исх. нажмите здесь

В этом случае вы должны использовать монго $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"
}
})
Другие вопросы по тегам