MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB aktualisiert alle Felder des Array-Fehlers

BEARBEITEN

Das in der Frage fehlende Detail war, dass sich das zu aktualisierende Pflichtfeld tatsächlich in einem Unterdokument befand . Dies ändert die Antwort erheblich:

Dies ist eine Einschränkung dessen, was Sie möglicherweise können tun mit dem Aktualisieren von Array-Elementen. Und dies wird in der Dokumentation deutlich erklärt . Meistens in diesem Absatz:

Also hier ist das Ding. Es wird versucht, alle zu aktualisieren der Array-Elemente in einer einzelnen Anweisung wie dieser nicht Arbeit. Dazu müssen Sie Folgendes tun.

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 );
})

Das ist im Grunde der Weg, alle zu aktualisieren Array-Element.

Der Multi Einstellung in .update() bedeutet über mehrere "Dokumente". Es kann nicht auf mehrere Elemente eines Arrays angewendet werden. Daher ist derzeit die beste Option, das ganze Ding zu ersetzen. Oder wir ersetzen in diesem Fall genauso gut das Ganze dokumentieren, da wir das sowieso tun müssen.

Für echt Massendaten, verwenden Sie db.eval() . Aber bitte lesen zuerst die Dokumentation:

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 );
    });
})

Aktualisieren Sie alle die Elemente in einem Array über das Ganze Sammlung ist nicht einfach.

Original

Ziemlich genau das, was der Fehler sagt. Um einen Positionsoperator zu verwenden, müssen Sie ihn übereinstimmen etwas zuerst. Wie in:

db.warehouses.update(
    // query 
    {
        _id:ObjectId('5322f07e139cdd7e31178b78'),
        "items.qty": { "$gt": 0 }
    },    
    // update 
    {
        $set:{"items.$.qty":0}
    },    
    // options 
    {
        "multi" : true,  
        "upsert" : true  
    }
);

Also wo das Spiel Bedingung findet die Position der Elemente, die kleiner als sind 0 dann dieser Index wird an den Positionsoperator übergeben.

PS :Wenn muti ist wahr es bedeutet, dass es alle aktualisiert dokumentieren. Lassen Sie es false wenn Sie nur einen meinen . Dies ist die Standardeinstellung.