Untuk meningkatkan kinerja, manfaatkan penggunaan Bulk()
API untuk memperbarui koleksi secara efisien dalam jumlah besar karena Anda akan mengirim operasi ke server dalam batch (misalnya, ukuran batch 500). Ini memberi Anda kinerja yang jauh lebih baik karena Anda tidak akan mengirim setiap permintaan ke server tetapi hanya sekali dalam setiap 500 permintaan, sehingga membuat pembaruan Anda lebih efisien dan lebih cepat.
Berikut ini menunjukkan pendekatan ini, contoh pertama menggunakan Bulk()
API tersedia dalam versi MongoDB>=2.6 dan <3.2. Ini memperbarui semua dokumen yang cocok dalam koleksi dari larik yang diberikan dengan menambah 1 ke bidang yang ditampilkan. Ini mengasumsikan array gambar memiliki struktur
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" }
]
Versi MongoDB>=2.6 dan <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(); }
Contoh berikutnya berlaku untuk MongoDB versi 3.2 yang baru, yang sejak itu tidak lagi menggunakan Bulk()
API dan menyediakan kumpulan api yang lebih baru menggunakan bulkWrite()
.
MongoDB versi 3.2 dan yang lebih baru :
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);