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

Mongo групово намиране и актуализиране на полето за съответстващи документи в една заявка?

За подобрена производителност се възползвайте от използването на Bulk() API за ефективно обновяване на колекцията в насипно състояние, тъй като ще изпращате операциите до сървъра на партиди (например, да речем размер на партида от 500). Това ви дава много по-добра производителност, тъй като няма да изпращате всяка заявка до сървъра, а само веднъж на всеки 500 заявки, като по този начин правите актуализациите си по-ефективни и по-бързи.

Следното демонстрира този подход, първият пример използва Bulk() API наличен във версии на MongoDB>=2.6 и <3.2. Той актуализира всички съвпадащи документи в колекцията от даден масив, като увеличава 1 до показаното поле. Предполага се, че масивът от изображения има структура

var images = [
    { "_id": 1, "name": "img_1.png" },
    { "_id": 2, "name": "img_2.png" }
    { "_id": 3, "name": "img_3.png" },
    ...
    { "_id": n, "name": "img_n.png" }
]

Версии на MongoDB>=2.6 и <3.2 :

var bulk = db.images.initializeUnorderedBulkOp(),
    counter = 0;

images.forEach(function (doc) {    
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$inc": { "shown": 1 }
    });

    counter++;
    if (counter % 500 === 0) {
        // Execute per 500 operations
        bulk.execute(); 
        // re-initialize every 500 update statements
        bulk = db.images.initializeUnorderedBulkOp();
    }
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }

Следващият пример се отнася за новата версия на MongoDB 3.2, която оттогава е оттеглила Bulk() API и предостави по-нов набор от apis с помощта на bulkWrite() .

MongoDB версия 3.2 и по-нова :

var ops = [];
images.forEach(function(doc) {
    ops.push({
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": {
                "$inc": { "shown": 1 }
            }
        }
    });

    if (ops.length === 500 ) {
        db.images.bulkWrite(ops);
        ops = [];
    }
})

if (ops.length > 0)  
    db.images.bulkWrite(ops);



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как мога да деактивирам съобщенията в журнала на MongoDB в конзолата?

  2. MongoDB:Сървърът има предупреждения при стартиране

  3. MongoDB $dateFromParts

  4. Разлика между съхраняването на ObjectId и неговата низова форма в MongoDB

  5. Изпълнете mongodb shell скрипт чрез C# драйвер