Menggunakan bulkWrite
API untuk melakukan pembaruan menangani ini dengan lebih baik
mongodb.connect(mongo_url, function(err, db) {
if(err) console.log(err)
else {
var mongo_products_collection = db.collection("products")
mongoUpsert(mongo_products_collection, data_products, function() {
db.close()
})
}
})
function mongoUpsert(collection, data_array, cb) {
var bulkUpdateOps = data_array.map(function(data) {
return {
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
};
});
collection.bulkWrite(bulkUpdateOps, function(err, r) {
// do something with result
});
return cb(false);
}
Jika Anda berurusan dengan array yang lebih besar yaitu> 1000 maka pertimbangkan untuk mengirim penulisan ke server dalam batch 500 yang memberi Anda kinerja yang lebih baik karena Anda tidak mengirim setiap permintaan ke server, hanya sekali dalam setiap 500 permintaan.
Untuk operasi massal, MongoDB memberlakukan batas internal default 1000 operasi per batch sehingga pilihan 500 dokumen baik dalam arti bahwa Anda memiliki kontrol atas ukuran batch daripada membiarkan MongoDB memaksakan default, yaitu untuk operasi yang lebih besar dalam besarnya> 1000 dokumen. Jadi untuk kasus di atas dalam pendekatan pertama, kita bisa menulis semua array sekaligus karena ini kecil tetapi pilihan 500 adalah untuk array yang lebih besar.
var ops = [],
counter = 0;
data_array.forEach(function(data) {
ops.push({
"updateOne": {
"filter": {
"product_id": data.product_id,
"post_modified": { "$ne": data.post_modified }
},
"update": { "$set": data },
"upsert": true
}
});
counter++;
if (counter % 500 == 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
});
ops = [];
}
})
if (counter % 500 != 0) {
collection.bulkWrite(ops, function(err, r) {
// do something with result
}
}