Es ist explodiert, weil Sie nicht auf den Abschluss eines asynchronen Aufrufs warten, bevor Sie mit der nächsten Iteration fortfahren. Dies bedeutet, dass Sie einen "Stapel" von ungelösten Vorgängen aufbauen, bis dies ein Problem verursacht. Wie heißt diese Seite noch mal? Bild bekommen?
Dies ist also nicht der beste Weg, um mit "Bulk"
fortzufahren Einfügungen. Glücklicherweise hat der zugrunde liegende MongoDB-Treiber, abgesehen von dem oben erwähnten Callback-Problem, bereits darüber nachgedacht. Es gibt tatsächlich eine "Bulk-API"
zur Verfügung, um dies noch viel besser zu machen. Und vorausgesetzt, Sie haben den nativen Treiber bereits als db
gezogen Objekt. Aber ich ziehe es vor, nur die .collection
zu verwenden Accessor aus dem Modell und "async"
Modul, um alles klar zu machen:
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" ;
}
);
Der Unterschied besteht darin, beide "asynchronen" Callback-Methoden nach Abschluss zu verwenden, anstatt nur einen Stack aufzubauen, aber auch die "Bulk Operations API" zu verwenden, um die asynchronen Schreibaufrufe abzumildern, indem alles in Batch-Update-Anweisungen von 1000 Einträgen gesendet wird.
Dies baut nicht nur keinen Stapel von Funktionsausführungen wie Ihr eigener Beispielcode auf, sondern führt auch effiziente „Wire“-Transaktionen durch, indem nicht alles in einzelnen Anweisungen gesendet wird, sondern in überschaubare „Batches“ für die Serverzusage aufgeteilt wird .