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.