Что-то не так с индексом '$' для обновления данных 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"
}
})