РЕДАКТИРАНЕ
Подробностите, които липсваха във въпроса, бяха, че задължителното поле за актуализиране всъщност е в поддокумент . Това значително променя отговора:
Това е ограничение на това, което можете да евентуално направете с актуализиране на елементите на масива. И това е ясно обяснено в документацията . Най-вече в този параграф:
Така че това е нещото. Опитвам се да актуализирам всички от елементите на масива в едно изявление като това няма работа. За да направите това, трябва да направите следното.
db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
doc.items.forEach(function(item) {
item.qty = 0;
});
db.warehouses.update({ "_id": doc._id }, doc );
})
Което всъщност е начинът за актуализиране навсеки елемент от масив.
Мултината настройка в .update()
означава в множество "документи". Неможе да се прилага към множество елементи от масив. Така че в момента най-добрият вариант е да смените цялото нещо. Или в този случай можем също така да заменимцелия документ, тъй като така или иначе трябва да направим това.
Застивен групови данни, използвайте db.eval() . Но моля, прочетете първо документацията:
db.eval(function() {
db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
doc.items.forEach(function(item) {
item.qty = 0;
});
db.warehouses.update({ "_id": doc._id }, doc );
});
})
Актуализиравсички елементите в масив през цялото събирането не е просто.
Оригинал
Почти точно това, което казва грешката. За да използвате позиционен оператор, трябва да свържете нещо първо. Както в:
db.warehouses.update(
// query
{
_id:ObjectId('5322f07e139cdd7e31178b78'),
"items.qty": { "$gt": 0 }
},
// update
{
$set:{"items.$.qty":0}
},
// options
{
"multi" : true,
"upsert" : true
}
);
И така, къде е съвпадението състояние перки на позицията от елементите, които са по-малко от 0 след това този индекс се предава на позиционния оператор.
P.S :При смути е вярно това означава, че се актуализира всеки документ. Оставете го false
ако имате предвид само един . Което е по подразбиране.