Избухна, защото не чакате асинхронно повикване да завърши, преди да преминете към следващата итерация. Това означава, че изграждате "стек" от неразрешени операции, докато това не причини проблем. Как се казва пак този сайт? Разбра ли снимката?
Така че това не е най-добрият начин да продължите с "Групово"
вмъквания. За щастие основният драйвер на MongoDB вече е помислил за това, освен проблема с обратното извикване, споменат по-рано. Всъщност има "Bulk API"
на разположение, за да направи това много по-добро. И ако приемем, че вече сте изтеглили родния драйвер като db
обект. Но предпочитам просто да използвам .collection
инструмент за достъп от модела и "async"
модул, за да стане всичко ясно:
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" ;
}
);
Разликата там е използването на двата метода за обратно извикване на „асинхронно“ при завършване, вместо просто изграждане на стек, но също така и използване на „API за масови операции“, за да се смекчат асинхронните извиквания за запис чрез подаване на всичко в изявления за пакетно актуализиране от 1000 записа.
Това не само не „изгражда стек“ от изпълнение на функции като вашия собствен примерен код, но също така извършва ефективни „жични“ транзакции, като не изпраща всичко в отделни изрази, а по-скоро се разбива на управляеми „партиди“ за ангажиране на сървъра .