sql >> Database >  >> NoSQL >> MongoDB

Hoe een groot aantal documenten in MongoDB het meest efficiënt bijwerken?

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 update operaties die eenvoudigweg abstracties zijn bovenop de server om het gemakkelijk te maken om bulkoperaties te bouwen. 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.

Voor uw drie veelvoorkomende gebruikssituaties zou u de Bulk API als volgt kunnen implementeren:

Geval 1. Type waarde van eigendom wijzigen, zonder de waarde te wijzigen:

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

Geval 2. Nieuw onroerend goed toevoegen op basis van waarde van bestaand onroerend goed:

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

Geval 3. Eenvoudig toevoegen van eigenschappen verwijderen uit documenten.

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. Hoe kan ik een document op _id ophalen?

  2. Mongoose-versiebeheer:wanneer is het veilig om het uit te schakelen?

  3. Heroku:Achtergrondtaken in Python met RQ

  4. Strings samenvoegen in SQL