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