Vybuchlo to, protože nečekáte na dokončení asynchronního volání, než přejdete k další iteraci. To znamená, že vytváříte „hromadu“ nevyřešených operací, dokud to nezpůsobí problém. Jak se opět jmenuje tento web? Získat obrázek?
Toto tedy není nejlepší způsob, jak pokračovat s "Hromadné"
vložení. Naštěstí o tom základní ovladač MongoDB již přemýšlel, kromě problému se zpětným voláním, který byl zmíněn dříve. Ve skutečnosti existuje "Hromadné API"
k dispozici, aby to bylo mnohem lepší. A za předpokladu, že jste již stáhli nativní ovladač jako db
objekt. Ale raději používám pouze .collection
přístupový prvek z modelu a "async"
modul, aby bylo vše jasné:
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" ;
}
);
Rozdíl je v použití obou „asynchronních“ metod zpětného volání po dokončení namísto pouhého vytváření zásobníku, ale také v použití „rozhraní API pro hromadné operace“ ke zmírnění volání asynchronního zápisu odesláním všeho v příkazech dávkové aktualizace 1000 položek.
Nejen, že se tím „nevytvoří hromada“ provádění funkcí jako váš vlastní vzorový kód, ale také se provádí efektivní „drátové“ transakce tím, že se vše neposílá v jednotlivých výpisech, ale spíše se rozděluje do zvládnutelných „dávek“ pro nasazení serveru. .