2016-06-28 3 views
1

Как вы подходите к документам для массового/пакетного обновления (до 10 тыс. Документов) в сочетании с forEach? (Никакие конкретные критерии не обновлять путем, используется для случайного выбора документа)MongoDB массовое обновление эффективности с использованием forEach

Я смотрю на двух вариантах:

  1. Соберите все документы _id в forEach закрытия в массив, а затем выполнить обновление с помощью collection.update({_id : {$in : idsArray}}, ...)
  2. запросов Добавить обновление в forEach закрытии до операции массовых и выполнить один раз сделать, где-то вдоль линий bulk.find({_id: doc.id}).updateOne({...}); bulk.execute();

Я собираюсь оценить это в ближайшее время, но я хотел бы знать, что больше работает в режиме ввода-вывода и считается «умным» с Монго.

ответ

2

ОК, поэтому я проверил два варианта.

TL; DR вариант один в два раза быстрее, поэтому собирайте идентификаторы и обновляйте один раз.

для дальнейшего использования, еще некоторые детали для:

  • Общее количество документов в БД составляет около 500К.
  • Документы содержат около 20-25 полей каждый.
  • Был ли обновлен документ 10-30k.

Результаты (раз специфичны машина, но относительная разница в том, что имеет значение):

  1. Одно обновление с идентификаторами массива: 200-500ms.
  2. Массовое обновление: 600-1000мс.

Оглядываясь назад, я думал, что объем может быть быстрее, потому что, возможно, была скрытая оптимизация. Но я понимаю, что в вопросе отсутствовала логика, меньше операций, вероятно, означает более быстрый, следовательно, объемный объем медленнее.

+0

Хороший кусок знания; Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^