sql >> Database >  >> NoSQL >> MongoDB

Mongo bulksgewijs zoeken en bijwerken van overeenkomende documenten in één zoekopdracht?

Voor verbeterde prestaties kunt u profiteren van het gebruik van een Bulk() API voor het efficiënt bijwerken van de verzameling in bulk, aangezien u de bewerkingen in batches naar de server verzendt (bijvoorbeeld een batchgrootte van 500). Dit geeft u veel betere prestaties, aangezien u niet elk verzoek naar de server verzendt, maar slechts één keer op de 500 verzoeken, waardoor uw updates efficiënter en sneller worden.

Het volgende demonstreert deze aanpak, het eerste voorbeeld gebruikt de Bulk() API beschikbaar in MongoDB-versies>=2.6 en <3.2. Het werkt alle overeenkomende documenten in de verzameling bij van een bepaalde array door 1 te verhogen naar het getoonde veld. Het gaat ervan uit dat de reeks afbeeldingen de structuur heeft

var images = [
    { "_id": 1, "name": "img_1.png" },
    { "_id": 2, "name": "img_2.png" }
    { "_id": 3, "name": "img_3.png" },
    ...
    { "_id": n, "name": "img_n.png" }
]

MongoDB-versies>=2.6 en <3.2 :

var bulk = db.images.initializeUnorderedBulkOp(),
    counter = 0;

images.forEach(function (doc) {    
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$inc": { "shown": 1 }
    });

    counter++;
    if (counter % 500 === 0) {
        // Execute per 500 operations
        bulk.execute(); 
        // re-initialize every 500 update statements
        bulk = db.images.initializeUnorderedBulkOp();
    }
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }

Het volgende voorbeeld is van toepassing op de nieuwe MongoDB-versie 3.2 die sindsdien de Bulk() heeft afgeschaft API en leverde een nieuwere set api's met behulp van bulkWrite() .

MongoDB versie 3.2 en hoger :

var ops = [];
images.forEach(function(doc) {
    ops.push({
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": {
                "$inc": { "shown": 1 }
            }
        }
    });

    if (ops.length === 500 ) {
        db.images.bulkWrite(ops);
        ops = [];
    }
})

if (ops.length > 0)  
    db.images.bulkWrite(ops);



  1. Aan de slag met Python en MongoDB

  2. Kan geen verbinding maken met 127.0.0.1:27017, reden:errno:111 Verbinding geweigerd

  3. Implementeer ik het serialiseren en deserialiseren van NodesJS + Passport + RedisStore?

  4. Kan geen verbinding maken met mongodb errno:61 Verbinding geweigerd