MODIFICA
Il dettaglio mancante nella domanda era che il campo richiesto per l'aggiornamento era in realtà in un sotto-documento . Questo cambia notevolmente la risposta:
Questo è un vincolo di ciò che puoi eventualmente fare con l'aggiornamento degli elementi dell'array. E questo è chiaramente spiegato nella documentazione . Principalmente in questo paragrafo:
Quindi ecco la cosa. Tentativo di aggiornare tutto degli elementi dell'array in una singola istruzione come questa non opera. Per fare ciò è necessario quanto segue.
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 );
})
Che è fondamentalmente il modo per aggiornare ogni elemento dell'array.
Il multi impostazione in .update()
significa attraverso più "documenti". non può essere applicato a più elementi di un array. Quindi attualmente l'opzione migliore è sostituire il tutto. O in questo caso potremmo anche sostituire il tutto documento poiché dobbiamo farlo comunque.
Per reale dati in blocco, utilizzare db.eval() . Ma leggi per favore prima la documentazione:
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 );
});
})
Aggiornamento di tutto gli elementi in una matrice in tutto il tutto la raccolta non è semplice
Originale
Praticamente esattamente quello che dice l'errore. Per utilizzare un operatore posizionale devi corrispondere prima qualcosa. Come in:
db.warehouses.update(
// query
{
_id:ObjectId('5322f07e139cdd7e31178b78'),
"items.qty": { "$gt": 0 }
},
// update
{
$set:{"items.$.qty":0}
},
// options
{
"multi" : true,
"upsert" : true
}
);
Quindi dove la corrispondenza condizione definisce la posizione degli elementi che sono minori di 0 quindi quell'indice viene passato all'operatore posizionale.
PS :Quando muti è vero significa che si aggiorna ogni documento. Lascialo false
se intendi solo uno . Qual è l'impostazione predefinita.