U kunt het doen, maar u moet uw aanroepconventies wijzigen om dit te doen, omdat alleen het "callback" -formulier daadwerkelijk een verzamelingsobject retourneert waarvan de .initializeUnorderedBulkOp()
methode kan worden aangeroepen. Er zijn ook enkele gebruiksverschillen met hoe u denkt dat dit werkt:
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
});
});
Dus de eigenlijke "Bulk"-methoden zelf vereisen geen callbacks en werken precies zoals weergegeven in de documentatie. De uitzondering is .execute()
die de verklaringen daadwerkelijk naar de server stuurt.
Hoewel het stuurprogramma dit enigszins voor u zal oplossen, is het waarschijnlijk geen goed idee om te veel bewerkingen in de wachtrij te zetten voordat u execute aanroept. Dit bouwt zich in feite op in het geheugen, en hoewel het stuurprogramma slechts batches van 1000 tegelijk verzendt (dit is een serverlimiet en de volledige batch is minder dan 16 MB), wilt u hier waarschijnlijk wat meer controle, in ieder geval om geheugengebruik beperken.
Dat is het punt van de modulo-tests zoals getoond, maar als geheugen voor het bouwen van de operaties en een mogelijk heel groot responsobject geen probleem voor je zijn, kun je gewoon operaties in de rij blijven zetten en .execute() code> een keer.
Het "antwoord" heeft hetzelfde formaat als aangegeven in de documentatie voor BulkWriteResult.