За подобрена производителност се възползвайте от използването на Bulk()
API за ефективно обновяване на колекцията в насипно състояние, тъй като ще изпращате операциите до сървъра на партиди (например, да речем размер на партида от 500). Това ви дава много по-добра производителност, тъй като няма да изпращате всяка заявка до сървъра, а само веднъж на всеки 500 заявки, като по този начин правите актуализациите си по-ефективни и по-бързи.
Следното демонстрира този подход, първият пример използва Bulk()
API наличен във версии на MongoDB>=2.6 и <3.2. Той актуализира всички съвпадащи документи в колекцията от даден масив, като увеличава 1 до показаното поле. Предполага се, че масивът от изображения има структура
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>=2.6 и <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(); }
Следващият пример се отнася за новата версия на MongoDB 3.2, която оттогава е оттеглила Bulk()
API и предостави по-нов набор от apis с помощта на bulkWrite()
.
MongoDB версия 3.2 и по-нова :
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);