MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB aggiorna tutti i campi di errore dell'array

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.