MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB में बड़ी संख्या में दस्तावेज़ों को सबसे अधिक प्रभावी ढंग से कैसे अपडेट करें?

यदि आपका MongoDB सर्वर 2.6 या नया है, तो बेहतर होगा कि आप राइट कमांड का उपयोग करें बल्क एपीआई जो थोक के निष्पादन की अनुमति देता है update ऑपरेशंस जो सर्वर के शीर्ष पर केवल एब्स्ट्रैक्शन हैं, जिससे बल्क ऑपरेशंस बनाना आसान हो जाता है। ये बल्क ऑपरेशन मुख्य रूप से दो फ्लेवर में आते हैं:

  • थोक संचालन का आदेश दिया . ये ऑपरेशन सभी ऑपरेशन को क्रम में निष्पादित करते हैं और पहली राइट एरर पर एरर आउट करते हैं।
  • अनियंत्रित थोक संचालन . ये ऑपरेशन सभी ऑपरेशनों को समानांतर में निष्पादित करते हैं और सभी त्रुटियों को जोड़ते हैं। अनियंत्रित थोक संचालन निष्पादन के आदेश की गारंटी नहीं देता है।

ध्यान दें, पुराने सर्वरों के लिए 2.6 से अधिक के लिए एपीआई संचालन को कम कर देगा। हालांकि 100% को कम करना संभव नहीं है, इसलिए कुछ किनारे के मामले हो सकते हैं जहां यह सही संख्या की सही रिपोर्ट नहीं कर सकता है।

आपके तीन सामान्य उपयोग के मामलों के लिए, आप बल्क एपीआई को इस तरह कार्यान्वित कर सकते हैं:

मामला 1. मूल्य बदले बिना संपत्ति के मूल्य का प्रकार बदलें:

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

मामला 2. मौजूदा संपत्ति के मूल्य के आधार पर नई संपत्ति जोड़ें:

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

मामला 3. बस दस्तावेज़ों से गुण निकालना जोड़ना।

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एक सरणी में वस्तु को आबाद करें

  2. update_attributes हमेशा सही होता है, भले ही Nested_attributes मान्य न हों

  3. गोलांग-एमजीओ में $शाब्दिक उपयोग

  4. MongoDB स्पाइडरमोन्की UTF-8 को नहीं समझता है

  5. Yii2 सक्रिय रिकॉर्ड मोंगो मॉडल के बीच संबंध कैसे बनाते हैं