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

Como usar a inserção em massa não ordenada com Mongoskin?


Você pode fazer isso, mas precisa alterar suas convenções de chamada para fazer isso, pois apenas o formulário "callback" retornará um objeto de coleção do qual o .initializeUnorderedBulkOp() método pode ser chamado. Há também algumas diferenças de uso em como você acha que isso 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
        });
});

Portanto, os métodos "em massa" em si não exigem retornos de chamada e funcionam exatamente como mostrado na documentação. A exceção é .execute() que realmente envia as instruções para o servidor.

Embora o driver resolva isso um pouco para você, provavelmente não é uma boa ideia enfileirar muitas operações antes de chamar execute. Isso basicamente se acumula na memória e, embora o driver envie apenas lotes de 1000 por vez (este é um limite do servidor, bem como o lote completo abaixo de 16 MB), você provavelmente deseja um pouco mais de controle aqui, pelo menos para limitar o uso de memória.

Esse é o ponto dos testes de módulo como mostrado, mas se a memória para construir as operações e um objeto de resposta possivelmente muito grande não forem um problema para você, então você pode continuar enfileirando as operações e chamar .execute() uma vez.

A "resposta" está no mesmo formato fornecido na documentação do BulkWriteResult.