MongoDB map-reduce — эффект маляра Шлемиэля?

Проблема - в коллекции уже 45М записей. Каждые несколько часов по базе бегает map-reduce и аггрегирует данные. Проблема в том что с каждым днем он это делает все медленней и медленней.

Структура исходной коллекции примерно такая:
company_id:xxx, ts:.....
company_id:xxx, ts:.....
company_id:yyy, ts:.....
company_id:xxx, ts:.....
company_id:yyy, ts:.....

Аггрегирующиай запрос приводит ее к такому:
ts:...., xxx:3,
ts....., yyy:2
и т.д. где ts - дата (без времени)

То-есть мап-редъюс бегает постоянно по огромному числу уже отработанных ts, выполняя работу которая уже была сделана. Как обычно решаются такие проблемы. Тоесть как заставить его бегать только по новым данным? Можно кончено как то запоминать последний ts на момент запуска обработчика и следующий запускать уже с фильтром {ts:{$gt:__stored_ts__}} но мне кажется это не правильно. Так как:
1 - непонтно какой ts сохранять - ts начала работы или когда работа завершена.
2 - как мержить данные в результирующей таблице. Пример. У company_id:xxx, за некий день ts: 20.02.2014 было 3, после прохождения алгоритмом у этой же xxx на этот же ts добавилось 6. Тоесть по сути в результирующей коллекции должно быть 9. Пока я вижу вариант только с map-reduce в отдельную коллекцию и запуск скрипта который обновит данные в основной сводной коллекции простым перебором значений.
  • Вопрос задан
  • 3060 просмотров
Решения вопроса 1
AMar4enko
@AMar4enko
А нет вариантов при вставке где-то обновлять счетчик ts: .... => xxx + 1 или ts: ... => yyy + 1 ?
Операция-то копеечная, зато сэкономит вам кучу времени
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
а википедия уже не помогает?
Ответ написан
@fuCtor
Ruby разработчик
В документации есть пример инкрементального выполнения MapReduce.
docs.mongodb.org/manual/tutorial/perform-increment...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы