MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да актуализирате голям брой документи в MongoDB най-ефективно?

Ако вашият MongoDB сървър е 2.6 или по-нов, би било по-добре да се възползвате от използването на команди за запис Групов API които позволяват групово изпълнение на update операции, които са просто абстракции на върха на сървъра, за да улеснят изграждането на групови операции. Тези групови операции се предлагат главно в два варианта:

  • Поръчани групови операции . Тези операции изпълняват всички операции по ред и извеждат грешка при първата грешка при запис.
  • Неподредени групови операции . Тези операции изпълняват всички операции паралелно и агрегират всички грешки. Неподредените групови операции не гарантират ред на изпълнение.

Имайте предвид, че за по-стари сървъри от 2.6 API ще преобразува операциите надолу. Въпреки това не е възможно да се преобразува надолу 100%, така че може да има някои крайни случаи, при които не може да отчете правилно точните числа.

За вашите три обичайни случая на употреба можете да внедрите Bulk API по следния начин:

Случай 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. Свържете се с mongodb, работещ в Docker

  2. групирайте по заявки за колекция от метеори

  3. MongoDB $dateFromString

  4. Пагинация на масива mongoDB

  5. Криптиране на MongoDB данни в покой