MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Upsert em massa no MongoDB usando mangusto


Não em "mangusto" especificamente, ou pelo menos ainda não no momento da escrita. O shell do MongoDB a partir da versão 2.6, na verdade, usa a "API de operações em massa" "nos bastidores", como se fosse para todos os métodos auxiliares gerais. Em sua implementação, ele tenta fazer isso primeiro e, se um servidor de versão mais antiga for detectado, haverá um "fallback" para a implementação legada.

Todos os métodos do mangusto "atualmente" usam a implementação "legada" ou a resposta de preocupação de gravação e os métodos legados básicos. Mas há um .collection acessador de qualquer modelo de mangusto que essencialmente acessa o "objeto de coleção" do "driver nativo do nó" subjacente no qual o mangusto é implementado:
 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
        });

 });

O principal problema é que os "métodos mangustos" estão realmente cientes de que uma conexão pode não ser feita ainda e "enfileirar" até que isso seja concluído. O driver nativo em que você está "se aprofundando" não faz essa distinção.

Então você realmente tem que estar ciente de que a conexão é estabelecida de alguma forma ou forma. Mas você pode usar os métodos do driver nativo desde que tenha cuidado com o que está fazendo.