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

Upsert masivo en MongoDB usando mongoose

No en "mangosta" específicamente, o al menos no todavía al momento de escribir. El shell de MongoDB a partir de la versión 2.6 en realidad usa la "API de operaciones masivas" "bajo el capó" como si fuera para todos los métodos generales de ayuda. En su implementación, intenta hacer esto primero, y si se detecta una versión anterior del servidor, entonces hay un "retroceso" a la implementación heredada.

Todos los métodos de mangosta "actualmente" usan la implementación "heredada" o la respuesta de preocupación de escritura y los métodos heredados básicos. Pero hay una .collection accesor de cualquier modelo de mongoose dado que esencialmente accede al "objeto de colección" desde el "controlador nativo del nodo" subyacente en el que se implementa mongoose:

 var mongoose = require('mongoose'),
     Schema = mongoose.Schema;

 mongoose.connect('mongodb://localhost/test');

 var sampleSchema  = new Schema({},{ "strict": false });

 var Sample = mongoose.model( "Sample", sampleSchema, "sample" );

 mongoose.connection.on("open", function(err,conn) { 

    var bulk = Sample.collection.initializeOrderedBulkOp();
    var counter = 0;

    // representing a long loop
    for ( var x = 0; x < 100000; x++ ) {

        bulk.find(/* some search */).upsert().updateOne(
            /* update conditions */
        });
        counter++;

        if ( counter % 1000 == 0 )
            bulk.execute(function(err,result) {             
                bulk = Sample.collection.initializeOrderedBulkOp();
            });
    }

    if ( counter % 1000 != 0 )
        bulk.execute(function(err,result) {
           // maybe do something with result
        });

 });

El problema principal es que los "métodos de mangosta" en realidad son conscientes de que es posible que aún no se haya realizado una conexión y "pongan en cola" hasta que se complete. El controlador nativo en el que está "indagando" no hace esta distinción.

Entonces, realmente debe ser consciente de que la conexión se establece de alguna manera o forma. Pero puede usar los métodos del controlador nativo siempre que tenga cuidado con lo que está haciendo.