Du kan göra det men du måste ändra dina anropskonventioner för att göra detta eftersom endast "återuppringning"-formuläret faktiskt returnerar ett samlingsobjekt från vilket .initializeUnorderedBulkOp()
metod kan kallas. Det finns också vissa användningsskillnader för hur du tror att detta fungerar:
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
});
});
Så själva "Bulk"-metoderna kräver inte återuppringningar och fungerar exakt som visas i dokumentationen. Undantaget är .execute()
som faktiskt skickar uttalanden till servern.
Även om drivrutinen kommer att reda ut det här något, är det förmodligen inte en bra idé att köa för många operationer innan du anropar execute. Detta byggs i princip upp i minnet, och även om drivrutinen bara skickar in batcher om 1000 åt gången (detta är en servergräns, liksom att hela batchen är under 16MB), vill du förmodligen ha lite mer kontroll här, åtminstone för att begränsa minnesanvändningen.
Det är poängen med modulo-testerna som visas, men om minne för att bygga operationerna och ett eventuellt riktigt stort svarsobjekt inte är ett problem för dig så kan du bara fortsätta att köa operationer och anropa .execute() en gång.
"Svaret" är i samma format som anges i dokumentationen för BulkWriteResult.