sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo guardar 1 millón de registros en mongodb de forma asíncrona?

Explotó porque no está esperando que se complete una llamada asincrónica antes de pasar a la siguiente iteración. Lo que esto significa es que está creando una "pila" de operaciones no resueltas hasta que esto causa un problema. ¿Cuál es el nombre de este sitio de nuevo? ¿Entiendes la imagen?

Así que esta no es la mejor manera de proceder con "Bulk" inserciones Afortunadamente, el controlador MongoDB subyacente ya ha pensado en esto, además del problema de devolución de llamada mencionado anteriormente. De hecho, existe una "API masiva" disponible para hacer esto mucho mejor. Y suponiendo que ya extrajo el controlador nativo como db objeto. Pero prefiero simplemente usar .collection accesor del modelo y "async" módulo para dejar todo claro:

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

La diferencia es usar ambos métodos de devolución de llamada "asincrónicos" al finalizar en lugar de simplemente construir una pila, pero también emplear la "API de operaciones masivas" para mitigar las llamadas de escritura asincrónicas al enviar todo en instrucciones de actualización por lotes de 1000 entradas.

Esto no solo no "construye una pila" de ejecución de funciones como su propio código de ejemplo, sino que también realiza transacciones "transferenciales" eficientes al no enviar todo en declaraciones individuales, sino que se divide en "lotes" manejables para el compromiso del servidor. .