UPRAVIT
V otázce chyběl detail, že požadované pole k aktualizaci bylo ve skutečnosti v dílčím dokumentu . To značně mění odpověď:
Toto je omezení toho, co možná můžete udělat s aktualizací prvků pole. A to je jasně vysvětleno v dokumentaci . Většinou v tomto odstavci:
Takže tady je ta věc. Pokus o aktualizaci všech prvků pole v jediném příkazu, jako je tento, nebude práce. Chcete-li to provést, musíte provést následující.
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 );
})
Což je v podstatě způsob, jak aktualizovat každý prvek pole.
Multi nastavení v .update()
znamená napříč více „dokumenty“. Nemůže být aplikován na více prvků pole. Takže v současné době je nejlepší možností vyměnit celou věc. Nebo v tomto případě můžeme stejně dobře nahradit celek dokument, protože to stejně musíme udělat.
skutečně hromadná data, použijte db.eval() . Ale přečtěte si nejprve dokumentaci:
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 );
});
})
Aktualizace všech prvky v poli napříč celkem sběr není jednoduchý.
Původní
Téměř přesně to, co chyba říká. Abyste mohli použít poziční operátor, musíte se shodovat nejdřív něco. Jako v:
db.warehouses.update(
// query
{
_id:ObjectId('5322f07e139cdd7e31178b78'),
"items.qty": { "$gt": 0 }
},
// update
{
$set:{"items.$.qty":0}
},
// options
{
"multi" : true,
"upsert" : true
}
);
Kde je tedy shoda podmínka zaujímá polohu z položek, které jsou méně než 0, pak tento index je předán pozičnímu operátoru.
P.S. :Když muti je pravda to znamená, že se aktualizuje každý dokument. Ponechte false
pokud máte na mysli pouze jeden . Což je výchozí.