sql >> Database >  >> NoSQL >> MongoDB

Hoe kan ik 1 miljoen records asynchroon op Mongodb opslaan?

Het ontplofte omdat je niet wacht tot een asynchrone oproep is voltooid voordat je doorgaat naar de volgende iteratie. Dit betekent dat u een "stapel" van onopgeloste bewerkingen aan het bouwen bent totdat dit een probleem veroorzaakt. Hoe heet deze site ook alweer? Krijg je de foto?

Dit is dus niet de beste manier om verder te gaan met "Bulk" invoegingen. Gelukkig heeft de onderliggende MongoDB-driver hier al over nagedacht, afgezien van het eerder genoemde callback-probleem. Er is in feite een "Bulk API" beschikbaar om dit een stuk beter te maken. En ervan uitgaande dat je de native driver al hebt opgehaald als de db object. Maar ik gebruik liever gewoon de .collection accessor van het model, en de "async" module om alles duidelijk te maken:

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" ;
  }
);

Het verschil daar is het gebruik van beide "asynchrone" callback-methoden bij voltooiing in plaats van alleen het opbouwen van een stapel, maar ook het gebruik van de "Bulk Operations API" om de asynchrone schrijfaanroepen te verminderen door alles in batch-update-instructies van 1000 items in te dienen.

Dit bouwt niet alleen niet alleen "een stapel" van functie-uitvoeringen op zoals uw eigen voorbeeldcode, maar voert ook efficiënte "wire"-transacties uit door niet alles allemaal in afzonderlijke verklaringen te verzenden, maar eerder op te splitsen in beheersbare "batches" voor serverbetrokkenheid .



  1. pymongo-syntaxis om een ​​subdocument bij te werken

  2. MongoDB werkt alle velden met arrayfout bij

  3. Hoe geneste opzoekarray in mangoest te aggregeren?

  4. Mongo geaggregeerde geneste array