Możesz to zrobić, ale musisz zmienić konwencje wywoływania, aby to zrobić, ponieważ tylko formularz „callback” faktycznie zwróci obiekt kolekcji, z którego .initializeUnorderedBulkOp()
można wywołać metodę. Istnieją również pewne różnice w użytkowaniu w zależności od sposobu, w jaki to działa:
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
});
});
Tak więc rzeczywiste metody "Bulk" same w sobie nie wymagają wywołań zwrotnych i działają dokładnie tak, jak pokazano w dokumentacji. Wyjątek to .execute()
który faktycznie wysyła zestawienia do serwera.
Chociaż sterownik nieco to rozwiąże, prawdopodobnie nie jest dobrym pomysłem ustawianie w kolejce zbyt wielu operacji przed wywołaniem execute. To w zasadzie gromadzi się w pamięci i chociaż sterownik wyśle tylko partie 1000 na raz (jest to limit serwera, a także cała partia poniżej 16 MB), prawdopodobnie chcesz mieć tutaj trochę więcej kontroli, przynajmniej ogranicz użycie pamięci.
To jest punkt testów modulo, jak pokazano, ale jeśli pamięć do budowania operacji i możliwie bardzo duży obiekt odpowiedzi nie stanowią dla ciebie problemu, możesz po prostu kolejkować operacje i wywołać .execute() raz.
„Odpowiedź” ma taki sam format, jak podano w dokumentacji BulkWriteResult.