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

Jak nejúčinněji aktualizovat velké množství dokumentů v MongoDB?

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í hromadné provedení update operace, které jsou jednoduše abstrakcemi nad serverem, aby bylo snadné vytvářet hromadné operace. 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.

Pro vaše tři běžné případy použití byste mohli implementovat Bulk API takto:

Případ 1. Změňte typ hodnoty vlastnosti, aniž byste změnili hodnotu:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
    // Handle error
    if(err) throw err;

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

    // Case 1. Change type of value of property, without changing the value.        
    col.find({"timestamp": {"$exists": true, "$type": 2} }).each(function (err, doc) {

        var newTimestamp = parseInt(doc.timestamp);
        bulk.find({ "_id": doc._id }).updateOne({
            "$set": { "timestamp": newTimestamp }
        });

        counter++;

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

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

Případ 2 Přidejte novou vlastnost na základě hodnoty stávající vlastnosti:

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
    // Handle error
    if(err) throw err;

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

    // Case 2. Add new property based on value of existing property.        
    col.find({"name": {"$exists": false } }).each(function (err, doc) {

        var fullName = doc.firstname + " " doc.lastname;
        bulk.find({ "_id": doc._id }).updateOne({
            "$set": { "name": fullName }
        });

        counter++;

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

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

Případ 3 Jednoduše přidáte odebrání vlastností z dokumentů.

MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
    // Handle error
    if(err) throw err;

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

    // Case 3. Simply adding removing properties from documents.    
    col.find({"street_no": {"$exists": true } }).each(function (err, doc) {

        bulk.find({ "_id": doc._id }).updateOne({
            "$set": { "no": doc.street_no },
            "$unset": { "street_no": "" }
        });

        counter++;

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

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



  1. mongoDB:jak zvrátit $unwind

  2. při odstranění dokumentu z omezené kolekce v mongoDB došlo k chybě?

  3. Procento překrývajících se mnohoúhelníků

  4. Proč sada replik mongodb vyžaduje lichý počet hlasovacích uzlů?