För förbättrad prestanda, dra fördel av att använda en Bulk()
API för att uppdatera samlingen effektivt i bulk eftersom du kommer att skicka operationerna till servern i omgångar (exempelvis en batchstorlek på 500). Detta ger dig mycket bättre prestanda eftersom du inte kommer att skicka varje begäran till servern utan bara en gång av 500 förfrågningar, vilket gör dina uppdateringar mer effektiva och snabbare.
Följande visar detta tillvägagångssätt, det första exemplet använder Bulk()
API tillgängligt i MongoDB-versioner>=2.6 och <3.2. Den uppdaterar alla matchade dokument i samlingen från en given array genom att öka 1 till det visade fältet. Det förutsätter att bilduppsättningen 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 och <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(); }
Nästa exempel gäller den nya MongoDB version 3.2 som sedan dess har fasat ut Bulk()
API och tillhandahöll en nyare uppsättning apis med bulkWrite()
.
MongoDB version 3.2 och senare :
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);