Puoi farlo ma devi modificare le convenzioni di chiamata per farlo poiché solo il modulo "callback" restituirà effettivamente un oggetto raccolta da cui .initializeUnorderedBulkOp()
è possibile chiamare il metodo. Ci sono anche alcune differenze di utilizzo rispetto a come pensi che funzioni:
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
});
});
Quindi i metodi "Bulk" effettivi stessi non richiedono callback e funzionano esattamente come mostrato nella documentazione. L'eccezione è .execute()
che invia effettivamente le istruzioni al server.
Anche se il driver risolverà in qualche modo questo problema, probabilmente non è una buona idea mettere in coda troppe operazioni prima di chiamare execute. Questo sostanzialmente si accumula nella memoria e, sebbene il driver invierà solo batch di 1000 alla volta (questo è un limite del server e il batch completo è inferiore a 16 MB), probabilmente vorrai un po 'più di controllo qui, almeno per limitare l'utilizzo della memoria.
Questo è il punto dei test modulo come mostrato, ma se la memoria per la creazione delle operazioni e un oggetto di risposta possibilmente molto grande non sono un problema per te, puoi semplicemente continuare a mettere in coda le operazioni e chiamare .execute()
una volta.
La "risposta" è nello stesso formato fornito nella documentazione per BulkWriteResult.