sql >> Databasteknik >  >> NoSQL >> MongoDB

Bulkinsats i MongoDB med mungo

Du kanske vill använda insertMany() metod här om du använder den senaste Mongoose-versionen 4.4.X och högre, som i huvudsak använder Model.collection.insertMany() under huven och föraren kan hantera parallellisering >= 1000 dokument för dig.

myData = [Obj1, Obj2, Obj3.......];
Collection1.insertMany(myData, function(error, docs) {});

eller använda Promises för bättre felhantering

Collection1.insertMany(myData)
    .then(function(docs) {
         // do something with docs
    })
    .catch(function(err) {
        // error handling here
    });

Det fungerar genom att skapa ett gäng dokument, anropar .validate() på dem parallellt och anropar sedan den underliggande förarens insertMany() på resultatet av toObject({ virtuals: false }); av varje dokument. Även om insertMany() utlöser inte pre-save hooks, den har bättre prestanda eftersom den bara gör 1 tur och retur till servern istället för 1 för varje dokument.

För Mongoose-versioner ~3.8.8, ~3.8.22, 4.x som stöder MongoDB Server >=2.6.x , kan du använda Bulk API enligt följande

var bulk = Collection1.collection.initializeOrderedBulkOp(),
    counter = 0;

myData.forEach(function(doc) {
    bulk.insert(doc);

    counter++;
    if (counter % 500 == 0) {
        bulk.execute(function(err, r) {
           // do something with the result
           bulk = Collection1.collection.initializeOrderedBulkOp();
           counter = 0;
        });
    }
});

// Catch any docs in the queue under or over the 500's
if (counter > 0) {
    bulk.execute(function(err,result) {
       // do something with the result here
    });
}


  1. Filtrera bort dubbletter av arrayer och returnera den unika arrayen i mongodb-aggregation

  2. MongoDB replika hjärtslagsbegäran har överskridits

  3. syntax för att länka dokument i mongodb

  4. Redis vs Service Bus för pub/underscenario