Anda dapat melakukannya tetapi Anda perlu mengubah konvensi pemanggilan untuk melakukan ini karena hanya formulir "panggilan balik" yang akan benar-benar mengembalikan objek koleksi dari mana .initializeUnorderedBulkOp()
metode dapat dipanggil. Ada juga beberapa perbedaan penggunaan cara kerja ini menurut Anda:
var dbURI = urigoeshere;
var db = mongo.db(dbURI, {safe:true});
db.collection('collection',function(err,collection) {
var bulk = collection.initializeUnorderedBulkOp();
count = 0;
for (var i = 0; i < 200000; i++) {
bulk.insert({number: i});
count++;
if ( count % 1000 == 0 )
bulk.execute(function(err,result) {
// maybe do something with results
bulk = collection.initializeUnorderedBulkOp(); // reset after execute
});
});
// If your loop was not a round divisor of 1000
if ( count % 1000 != 0 )
bulk.execute(function(err,result) {
// maybe do something here
});
});
Jadi metode "Bulk" yang sebenarnya sendiri tidak memerlukan panggilan balik dan berfungsi persis seperti yang ditunjukkan dalam dokumentasi. Eksekusinya adalah .execute()
yang sebenarnya mengirimkan pernyataan ke server.
Meskipun driver akan menyelesaikannya untuk Anda, mungkin bukan ide yang baik untuk mengantri terlalu banyak operasi sebelum memanggil eksekusi. Ini pada dasarnya menumpuk di memori, dan meskipun driver hanya akan mengirim 1000 batch pada satu waktu (ini adalah batas server serta batch lengkap berada di bawah 16MB), Anda mungkin ingin sedikit lebih banyak kontrol di sini, setidaknya untuk batasi penggunaan memori.
Itulah inti dari tes modulo seperti yang ditunjukkan, tetapi jika memori untuk membangun operasi dan objek respons yang mungkin sangat besar tidak menjadi masalah bagi Anda, maka Anda dapat terus mengantre operasi dan memanggil .execute()
sekali.
"Respons" dalam format yang sama seperti yang diberikan dalam dokumentasi untuk BulkWriteResult.