Я не рекомендую использовать {multi: true} для большого набора данных, потому что он менее настраиваемый.
Лучший способ с использованием объемной вставки.
Массовая операция действительно полезна для задач планировщика. Скажем, вы должны удалять данные старше 6 месяцев в день. Используйте массовую операцию. Это быстро и не замедляет работу сервера. Процессор, использование памяти не заметно, когда вы вставляете, удаляете или обновляете более миллиарда документов. Я обнаружил, что {multi: true} замедляет работу сервера, когда вы имеете дело с миллионами документов (требуется больше исследований в этой области.)
См. Образец ниже. Это скрипт оболочки js, он может запускаться на сервере также как программа узла (для достижения этого используйте npm-модуль shelljs или аналогичный)
обновить Монго до 3,2 +
Обычный способ обновления нескольких уникальных документов -
let counter = 0;
db.myCol.find({}).sort({$natural:1}).limit(1000000).forEach(function(document){
counter++;
document.test_value = "just testing" + counter
db.myCol.save(document)
});
Прошло 310-315 секунд, когда я пытался. Это более 5 минут для обновления миллиона документов.
Моя коллекция включает более 100 миллионов документов, поэтому скорость может отличаться для других.
То же самое с использованием массовой вставки:
let counter = 0;
// magic no.- depends on your hardware and document size. - my document size is around 1.5kb-2kb
// performance reduces when this limit is not in 1500-2500 range.
// try different range and find fastest bulk limit for your document size or take an average.
let limitNo = 2222;
let bulk = db.myCol.initializeUnorderedBulkOp();
let noOfDocsToProcess = 1000000;
db.myCol.find({}).sort({$natural:1}).limit(noOfDocsToProcess).forEach(function(document){
counter++;
noOfDocsToProcess --;
limitNo--;
bulk.find({_id:document._id}).update({$set:{test_value : "just testing .. " + counter}});
if(limitNo === 0 || noOfDocsToProcess === 0){
bulk.execute();
bulk = db.myCol.initializeUnorderedBulkOp();
limitNo = 2222;
}
});
Лучшее время было 8972 миллис. Таким образом, в среднем потребовалось всего 10 секунд, чтобы обновить миллион документов. В 30 раз быстрее, чем по-старому.
Поместите код в файл .js и выполните как скрипт оболочки mongo.
Если кто-то нашел лучший способ, пожалуйста, обновите. Позволяет использовать монго быстрее.