sql >> Database >  >> NoSQL >> MongoDB

Correcte manier om veel records in Mongodb in te voegen met Node.js

Als uw MongoDB-server 2.6 of nieuwer is, is het beter om gebruik te maken van schrijfopdrachten Bulk API die de uitvoering van bulk-invoegbewerkingen mogelijk maken, wat eenvoudigweg abstracties zijn bovenop de server om het gemakkelijk te maken om bulkbewerkingen te bouwen en zo prestatiewinst te behalen met uw update over grote verzamelingen.

Het in batches verzenden van de bulk-invoegbewerkingen resulteert in minder verkeer naar de server en voert dus efficiënte draadtransacties uit door niet alles in afzonderlijke overzichten te verzenden, maar eerder op te splitsen in hanteerbare brokken voor serververplichting. Er is ook minder tijd om te wachten op het antwoord in de callback met deze aanpak.

Deze bulkoperaties zijn er hoofdzakelijk in twee smaken:

  • Bulkoperaties besteld . Deze bewerkingen voeren alle bewerkingen in volgorde uit en geven een foutmelding bij de eerste schrijffout.
  • Ongeordende bulkbewerkingen . Deze bewerkingen voeren alle bewerkingen parallel uit en aggregeren alle fouten. Ongeordende bulkoperaties garanderen geen volgorde van uitvoering.

Let op, voor oudere servers dan 2.6 zal de API de bewerkingen naar beneden converteren. Het is echter niet mogelijk om 100% naar beneden te converteren, dus er kunnen enkele randgevallen zijn waarbij het niet correct de juiste cijfers kan rapporteren.

In uw geval zou u de Bulk API-invoegbewerking in batches van 1000 als volgt kunnen implementeren:

Voor MongoDB 3.2+ met behulp van 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
        });
    }
};

Voor 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();             
        }); 
    } 
};

Roep de createNewEntries() . aan functie.

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


  1. Mongodb - $groep binnen een $groep (op 'sleutel')

  2. De eenvoudigste manier om een ​​exemplaar van een mangoestdocument te kopiëren/klonen?

  3. hoe dynamische documentsleutels te maken in mongodb

  4. mangoest/mongodb-query meerdere sorteringen