sql >> Databáze >  >> NoSQL >> MongoDB

Jak uložit 1 milion záznamů do mongodb asynchronně?

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. .



  1. databáze mongodb s Java play 2.0

  2. Jak vyloučit _id bez zahrnutí dalších polí pomocí agregačního rámce

  3. Jak provést řazení dotazu MongoDB podle řetězců s postfixem -number?

  4. Najděte záznamy z doby před 7 dny ode dneška v MongoDB