sql >> Databasteknik >  >> NoSQL >> MongoDB

Uppdatera alla element i en array i mongodb

Som nämnts är huvudproblemet här med uppdateringar av flera element med positionsoperatören som registrerats i detta långvariga nummer:http://jira.mongodb.org/browse/SERVER-1243

Grundfallet är därför att ingen enskild exekvering kan göra detta, så för att bearbeta för flera arrayelement behöver du någon metod för att bestämma hur många element du behöver uppdatera och bearbeta en uppdateringssats per varje element.

En förenklad metod för detta är i allmänhet att använda bulkoperationer för att bearbeta det som slutar med "flera" uppdateringsoperationer som en enda begäran och svar till servern:

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

Om dina uppdaterade dokument är ganska små, eller faktiskt bara ett enda dokument, kan du avstå från count kontrollera och lägg helt enkelt till alla bulkuppdateringar inom de nödvändiga looparna och kör bara en gång i slutet av alla loopar.

En längre förklaring och alternativ finns på Hur man uppdaterar flera matriselement , men alla kommer ner på olika sätt att matcha elementet för att uppdatera och bearbeta en positionell $ uppdatera flera gånger, antingen för varje matchat dokument eller tills det inte finns några fler ändrade dokument som returneras.




  1. C# 10gen och mongo:deserialisering för medlemmar som gränssnitt

  2. Hur kan jag pivotera på MongoDB

  3. Hantera timeouts med Node.js och mongodb

  4. Fråga distinkt med MongoMapper