sql >> Database >  >> NoSQL >> MongoDB

Werk alle elementen in een array bij in mongodb

Zoals vermeld, is het belangrijkste probleem hier met updates over meerdere elementen met de positionele operator zoals vastgelegd in dit al lang bestaande probleem:http://jira.mongodb.org/browse/SERVER-1243

Het basisgeval is daarom dat geen enkele uitvoering dit kan doen, dus om voor meerdere array-elementen te verwerken, hebt u een methode nodig om te bepalen hoeveel elementen u moet bijwerken en één update-instructie voor elk element te verwerken.

Een vereenvoudigde benadering hiervoor is over het algemeen het gebruik van Bulk Operations om te verwerken wat uiteindelijk "meerdere" update-bewerkingen zijn als een enkel verzoek en antwoord aan de server:

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

Als uw bijgewerkte documenten vrij klein zijn, of slechts één document, dan kunt u de count . achterwege laten controleer en voeg eenvoudig alle bulkupdates toe binnen de vereiste lussen en voer ze één keer uit aan het einde van alle lussen.

Een langere uitleg en alternatieven zijn te vinden op Meerdere array-elementen bijwerken , maar ze komen allemaal neer op verschillende benaderingen voor het matchen van het element om een ​​positionele $ update meerdere keren, voor elk document dat overeenkomt of totdat er geen gewijzigde documenten meer zijn geretourneerd.




  1. Hoe $lookup te gebruiken als INNER JOIN in MongoDB Aggregation?

  2. Inleiding tot gedistribueerde cache in Hadoop

  3. MongoDB Replica Set-lidstaat is ANDERE

  4. Overslaan/Mock Redis In Junit