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

¿Cómo usar la inserción masiva desordenada con Mongoskin?

Puede hacerlo, pero necesita cambiar sus convenciones de llamadas para hacer esto, ya que solo el formulario de "devolución de llamada" devolverá un objeto de colección desde el cual .initializeUnorderedBulkOp() Se puede llamar al método. También hay algunas diferencias de uso sobre cómo crees que funciona:

var dbURI = urigoeshere;
var db = mongo.db(dbURI, {safe:true});
db.collection('collection',function(err,collection) {
    var bulk = collection.initializeUnorderedBulkOp();
    count = 0;

    for (var i = 0; i < 200000; i++) {
        bulk.insert({number: i});
        count++;

        if ( count % 1000 == 0 )
            bulk.execute(function(err,result) {
               // maybe do something with results
               bulk = collection.initializeUnorderedBulkOp(); // reset after execute
            });      

    });

    // If your loop was not a round divisor of 1000
    if ( count % 1000 != 0 )
        bulk.execute(function(err,result) {
          // maybe do something here
        });
});

Por lo tanto, los métodos "a granel" reales en sí mismos no requieren devoluciones de llamada y funcionan exactamente como se muestra en la documentación. La excepción es .execute() que en realidad envía las declaraciones al servidor.

Si bien el controlador solucionará esto por usted, probablemente no sea una buena idea poner en cola demasiadas operaciones antes de llamar a ejecutar. Esto básicamente se acumula en la memoria, y aunque el controlador solo enviará lotes de 1000 a la vez (este es un límite del servidor y el lote completo tiene menos de 16 MB), probablemente desee un poco más de control aquí, al menos para limitar el uso de la memoria.

Ese es el punto de las pruebas de módulo como se muestra, pero si la memoria para construir las operaciones y un objeto de respuesta posiblemente muy grande no son un problema para usted, puede seguir poniendo en cola las operaciones y llamar a .execute() una vez.

La "respuesta" tiene el mismo formato que se indica en la documentación de BulkWriteResult.