Можете да го направите, но трябва да промените конвенциите си за повикване, за да направите това, тъй като само формуляра за обратно извикване всъщност ще върне обект на колекция, от който .initializeUnorderedBulkOp()
методът може да бъде извикан. Има и някои разлики в употребата на начина, по който смятате, че това работи:
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
});
});
Така че самите действителни "обемни" методи не изискват обратни извиквания и работят точно както е показано в документацията. Изключението е .execute()
което всъщност изпраща изявленията до сървъра.
Докато драйверът ще подреди това донякъде вместо вас, вероятно не е добра идея да наредите твърде много операции на опашка, преди да извикате execute. Това основно се натрупва в паметта и въпреки че драйверът ще изпраща само партиди от 1000 наведнъж (това е ограничение на сървъра, както и цялата партида е под 16MB), вероятно искате малко повече контрол тук, поне за ограничаване на използването на паметта.
Това е смисълът на модулните тестове, както е показано, но ако паметта за изграждане на операциите и евентуално наистина голям обект за отговор не са проблем за вас, тогава можете просто да продължите да нареждате операциите на опашка и да извикате .execute()код> веднъж.
"Отговорът" е в същия формат, както е даден в документацията за BulkWriteResult.