sql >> Database teknologi >  >> NoSQL >> MongoDB

Korrekt måde at indsætte mange poster i Mongodb med Node.js

Hvis din MongoDB-server er 2.6 eller nyere, ville det være bedre at bruge en skrivekommando Bulk API der giver mulighed for udførelse af bulk insert-operationer, som blot er abstraktioner oven på serveren for at gøre det nemt at bygge bulk-operationer og dermed få præstationsgevinster med din opdatering over store samlinger.

At sende bulkinsert-operationerne i batches resulterer i mindre trafik til serveren og udfører dermed effektive wire-transaktioner ved ikke at sende alt i individuelle opgørelser, men derimod bryde op i håndterbare bidder til serverforpligtelse. Der er også mindre tid til at vente på svaret i tilbagekaldet med denne tilgang.

Disse bulkoperationer kommer hovedsageligt i to varianter:

  • Bestilte masseoperationer . Disse operationer udfører hele operationen i rækkefølge og fejl ud på den første skrivefejl.
  • Uordrede masseoperationer . Disse operationer udfører alle operationerne parallelt og samler alle fejlene. Uordnede masseoperationer garanterer ikke udførelsesrækkefølgen.

Bemærk, for ældre servere end 2.6 vil API'en nedkonvertere operationerne. Det er dog ikke muligt at nedkonvertere 100 %, så der kan være nogle randtilfælde, hvor den ikke kan rapportere de rigtige tal korrekt.

I dit tilfælde kunne du implementere Bulk API-indsættelsesoperationen i batches af 1000 som denne:

Til MongoDB 3.2+ ved hjælp af bulkWrite

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects

var createNewEntries = function(db, entries, callback) {

    // Get the collection and bulk api artefacts
    var collection = db.collection('entries'),          
        bulkUpdateOps = [];    

    entries.forEach(function(doc) {
        bulkUpdateOps.push({ "insertOne": { "document": doc } });

        if (bulkUpdateOps.length === 1000) {
            collection.bulkWrite(bulkUpdateOps).then(function(r) {
                // do something with result
            });
            bulkUpdateOps = [];
        }
    })

    if (bulkUpdateOps.length > 0) {
        collection.bulkWrite(bulkUpdateOps).then(function(r) {
            // do something with result
        });
    }
};

For MongoDB <3.2

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects

var createNewEntries = function(db, entries, callback) {

    // Get the collection and bulk api artefacts
    var collection = db.collection('entries'),          
        bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
        counter = 0;    

    // Execute the forEach method, triggers for each entry in the array
    entries.forEach(function(obj) {         

        bulk.insert(obj);           
        counter++;

        if (counter % 1000 == 0 ) {
            // Execute the operation
            bulk.execute(function(err, result) {  
                // re-initialise batch operation           
                bulk = collection.initializeOrderedBulkOp();
                callback();
            });
        }
    });             

    if (counter % 1000 != 0 ){
        bulk.execute(function(err, result) {
            // do something with result 
            callback();             
        }); 
    } 
};

Kald createNewEntries() funktion.

MongoClient.connect(url, function(err, db) {
    createNewEntries(db, entries, function() {
        db.close();
    });
});


  1. mongodb-forespørgsel uden feltnavn

  2. 3 måder at konvertere en dato til en streng i MongoDB

  3. gruppeindsamlingsdata efter flere felter mongodb

  4. Er dokumentorienterede databaser beregnet til at erstatte relationelle databaser?