For forbedret ydeevne skal du udnytte en Bulk()
API til at opdatere samlingen effektivt i bulk, da du vil sende operationerne til serveren i batches (f.eks. f.eks. en batchstørrelse på 500). Dette giver dig meget bedre ydeevne, da du ikke sender alle anmodninger til serveren, men kun én gang for hver 500 anmodninger, hvilket gør dine opdateringer mere effektive og hurtigere.
Det følgende demonstrerer denne tilgang, det første eksempel bruger Bulk()
API tilgængelig i MongoDB-versioner>=2.6 og <3.2. Den opdaterer alle matchede dokumenter i samlingen fra en given matrix ved at øge 1 til det viste felt. Det antager, at rækken af billeder har strukturen
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-versioner>=2.6 og <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(); }
Det næste eksempel gælder for den nye MongoDB version 3.2, som siden har forældet Bulk()
API og leverede et nyere sæt API'er ved hjælp af bulkWrite()
.
MongoDB version 3.2 og nyere :
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);