MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann man 1 Million Datensätze asynchron in Mongodb speichern?

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 .