Wybuchł, ponieważ nie czekasz na zakończenie asynchronicznego wywołania przed przejściem do następnej iteracji. Oznacza to, że budujesz „stos” nierozwiązanych operacji, dopóki nie spowoduje to problemu. Jaka jest nazwa tej strony ponownie? Masz zdjęcie?
Nie jest to więc najlepszy sposób postępowania z "Bulk"
wstawki. Na szczęście sterownik MongoDB już o tym pomyślał, poza wspomnianym wcześniej problemem wywołania zwrotnego. W rzeczywistości istnieje "Bulk API"
dostępne, aby uczynić to o wiele lepszym. I zakładając, że ściągnąłeś już natywny sterownik jako db
obiekt. Ale wolę po prostu używać .collection
akcesor z modelu i "async"
moduł, aby wszystko było jasne:
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" ;
}
);
Różnica polega na używaniu obu „asynchronicznych” metod wywołania zwrotnego po zakończeniu, a nie tylko tworzeniu stosu, ale także wykorzystaniu „interfejsu API operacji zbiorczych” w celu złagodzenia asynchronicznych wywołań zapisu, przesyłając wszystko w instrukcjach aktualizacji wsadowej zawierających 1000 wpisów.
To nie tylko nie „buduje stosu” wykonywania funkcji, jak twój własny przykładowy kod, ale także wykonuje wydajne transakcje „przewodowe”, nie wysyłając wszystkiego w osobnych instrukcjach, ale raczej dzieli się na łatwe do zarządzania „partie” w celu zaangażowania serwera .