sql >> Databáze >  >> NoSQL >> MongoDB

Správný způsob vložení mnoha záznamů do Mongodb pomocí Node.js

Pokud je váš server MongoDB verze 2.6 nebo novější, bylo by lepší využít možnosti zápisu Hromadné API které umožňují provádění operací hromadného vkládání, které jsou pouhými abstrakcemi nad serverem, aby bylo možné snadno vytvářet hromadné operace, a tak získat zvýšení výkonu s vaší aktualizací přes velké kolekce.

Odesílání operací hromadného vkládání v dávkách má za následek menší provoz na serveru, a proto provádí efektivní drátové transakce tím, že neodesílá vše v jednotlivých výpisech, ale spíše se rozděluje na zvládnutelné části pro nasazení serveru. S tímto přístupem je také méně času čekání na odpověď ve zpětném volání.

Tyto hromadné operace přicházejí hlavně ve dvou příchutích:

  • Objednané hromadné operace . Tyto operace provedou všechny operace v pořadí a při první chybě zápisu dojde k chybě.
  • Neuspořádané hromadné operace . Tyto operace provádějí všechny operace paralelně a shromažďují všechny chyby. Neuspořádané hromadné operace nezaručují pořadí provedení.

Všimněte si, že u starších serverů než 2.6 API převede operace dolů. Není však možné převést dolů 100 %, takže se mohou vyskytnout okrajové případy, kdy nemůže správně hlásit správná čísla.

Ve vašem případě byste mohli implementovat operaci hromadného vložení API v dávkách po 1000 takto:

Pro MongoDB 3.2+ pomocí 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
        });
    }
};

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

Zavolejte createNewEntries() funkce.

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


  1. Je možné obsadit MongoDB-Query?

  2. Import doménových tříd ze samostatného modulu GORM do Grails

  3. Import/export MongoDB pomocí Node.js

  4. Rozdíl mezi count() a find().count() v MongoDB