Untuk data yang relatif kecil, Anda dapat mencapai hal di atas dengan mengulangi koleksi menggunakan snapshot
dengan forEach()
kursor
metode dan memperbarui setiap dokumen sebagai berikut:
db.wholesalers.find({
"brands": { "$exists": true, "$type": 4 }
}).snapshot().forEach(function(doc){
db.wholesalers.updateOne(
{ "_id": doc._id },
{ "$set": { "brandsNetherlands": doc.brands } }
);
});
Meskipun ini optimal untuk koleksi kecil, kinerja dengan koleksi besar sangat berkurang karena perulangan melalui kumpulan data besar dan mengirim setiap operasi pembaruan per permintaan ke server menimbulkan penalti komputasi.
Bulk()
API datang untuk menyelamatkan dan sangat meningkatkan kinerja karena operasi tulis dikirim ke server hanya sekali secara massal. Efisiensi dicapai karena metode ini tidak mengirim setiap permintaan tulis ke server (seperti pernyataan pembaruan saat ini dalam forEach()
loop) tetapi hanya sekali dalam setiap 1000 permintaan, sehingga membuat pembaruan lebih efisien dan lebih cepat daripada saat ini.
Menggunakan konsep yang sama di atas dengan forEach()
loop untuk membuat batch, kita dapat memperbarui koleksi secara massal sebagai berikut.
Dalam demonstrasi ini Bulk()
API tersedia dalam versi MongoDB >= 2.6 and < 3.2
menggunakan initializeUnorderedBulkOp()
metode untuk mengeksekusi secara paralel, serta dalam urutan nondeterministik, operasi tulis dalam batch:
var massal =db.wholesalers.initializeUnorderedBulkOp(),penghitung =0; // counter untuk melacak ukuran pembaruan batch
db.wholesalers.find({
"brands": { "$exists": true, "$type": 4 }
}).snapshot().forEach(function(doc){
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "brandsNetherlands": doc.brands }
});
counter++; // increment counter
if (counter % 1000 == 0) {
bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
bulk = db.wholesalers.initializeUnorderedBulkOp();
}
});
Contoh berikutnya berlaku untuk versi MongoDB baru 3.2
yang sejak itu tidak lagi menggunakan Bulk()
API dan menyediakan kumpulan api yang lebih baru menggunakan bulkWrite()
.
Ini menggunakan kursor yang sama seperti di atas tetapi membuat array dengan operasi massal menggunakan forEach()
metode kursor untuk mendorong setiap dokumen tulis massal ke array. Karena perintah tulis tidak dapat menerima lebih dari 1000 operasi, diperlukan operasi pengelompokan untuk memiliki paling banyak 1000 operasi dan menginisialisasi ulang array saat loop mencapai 1000 iterasi:
var cursor = db.wholesalers.find({
"brands": { "$exists": true, "$type": 4 }
}),
bulkUpdateOps = [];
cursor.snapshot().forEach(function(doc){
bulkUpdateOps.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "brandsNetherlands": doc.brands } }
}
});
if (bulkUpdateOps.length === 1000) {
db.wholesalers.bulkWrite(bulkUpdateOps);
bulkUpdateOps = [];
}
});
if (bulkUpdateOps.length > 0) { db.wholesalers.bulkWrite(bulkUpdateOps); }