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

Aktualisieren Sie alle Elemente in einem Array in Mongodb

Wie bereits erwähnt, besteht das Hauptproblem hier in Aktualisierungen zu mehreren Elementen mit dem Positionsoperator, wie in dieser langjährigen Ausgabe aufgezeichnet:http://jira.mongodb.org/browse/SERVER-1243

Der grundlegende Fall ist daher, dass keine einzelne Ausführung dies tun kann. Um also mehrere Array-Elemente zu verarbeiten, benötigen Sie eine Methode, um zu bestimmen, wie viele Elemente Sie aktualisieren müssen, und eine Aktualisierungsanweisung pro Element zu verarbeiten.

Ein vereinfachter Ansatz hierfür ist im Allgemeinen die Verwendung von Bulk Operations um "mehrere" Aktualisierungsvorgänge als eine einzige Anfrage und Antwort an den Server zu verarbeiten:

var bulk = db.collection.initializeOrderedBulkOp(),
    count = 0;

db.collection.find({ "name": "John Doe", "adds.status": "PENDING" }).forEach(function(doc) { 
    doc.adds.filter(function(add){ return add.status = "PENDING" }).forEach(function(add) {
        bulk.find({ "_id": doc._id, "adds.status": "PENDING" }).updateOne({
            "$set": { "adds.$.status": "APPROVED" }
        });
        count++;

        // Execute once in 1000 statements created and re-init
        if ( count % 1000 == 0 ) {
            bulk.execute();
            bulk = db.collection.initializeOrderedBulkOp();
        }
    });
});

// Execute any pending operations
if ( count % 1000 != 0 )
    bulk.execute();

Wenn Ihr aktualisiertes Dokument ziemlich klein ist oder tatsächlich nur ein einzelnes Dokument, dann können Sie auf die count verzichten überprüfen und einfach alle Massenaktualisierungen innerhalb der erforderlichen Schleifen anhängen und am Ende aller Schleifen nur einmal ausführen.

Eine längere Erklärung und Alternativen finden Sie unter How to Update Multiple Array Elements , aber alle laufen auf unterschiedliche Ansätze hinaus, um das zu aktualisierende Element abzugleichen und einen positionaler $ mehrmals aktualisieren, entweder für jedes übereinstimmende Dokument oder bis keine geänderten Dokumente mehr zurückgegeben werden.