Itu meledak karena Anda tidak menunggu panggilan asinkron untuk diselesaikan sebelum melanjutkan ke iterasi berikutnya. Artinya, Anda sedang membangun "tumpukan" operasi yang belum terselesaikan sampai ini menyebabkan masalah. Apa nama situs ini lagi? Dapatkan gambarnya?
Jadi ini bukan cara terbaik untuk melanjutkan dengan "Bulk"
sisipan. Untungnya driver MongoDB yang mendasarinya telah memikirkan hal ini, selain dari masalah panggilan balik yang disebutkan sebelumnya. Sebenarnya ada "Bulk API"
tersedia untuk membuat ini jauh lebih baik. Dan dengan asumsi Anda sudah menarik driver asli sebagai db
obyek. Tapi saya lebih suka menggunakan .collection
pengakses dari model, dan "async"
modul untuk memperjelas semuanya:
var bulk = Model.collection.initializeOrderedBulkOp();
var counter = 0;
async.whilst(
// Iterator condition
function() { return count < 1000000 },
// Do this in the iterator
function(callback) {
counter++;
var model = buildModel(counter);
bulk.insert(model);
if ( counter % 1000 == 0 ) {
bulk.execute(function(err,result) {
bulk = Model.collection.initializeOrderedBulkOp();
callback(err);
});
} else {
callback();
}
},
// When all is done
function(err) {
if ( counter % 1000 != 0 )
bulk.execute(function(err,result) {
console.log( "inserted some more" );
});
console.log( "I'm finished now" ;
}
);
Perbedaannya adalah menggunakan kedua metode panggilan balik "asinkron" pada penyelesaian daripada hanya membangun tumpukan, tetapi juga menggunakan "API Operasi Massal" untuk mengurangi panggilan tulis asinkron dengan mengirimkan semuanya dalam pernyataan pembaruan batch dari 1000 entri.
Ini tidak hanya tidak "membangun setumpuk" eksekusi fungsi seperti kode contoh Anda sendiri, tetapi juga melakukan transaksi "kawat" yang efisien dengan tidak mengirimkan semuanya dalam pernyataan individual, melainkan memecah menjadi "batch" yang dapat dikelola untuk komitmen server .