Перво-наперво, Map / Reduce не предназначен для анализа в реальном времени.Кроме того, MongoDB в настоящее время ограничивается одним ядром для M / R, что еще больше замедлит работу.
Так что, если вы собираетесь использовать M / R для получения данных, это не будет «в реальном времени»."оно будет обновляться каждые X минут (или часов).
Здесь есть два эффективных подхода:
- Инкрементальный M / R
- Счетчики реального времени
Опция № 1: Инкрементальное M / R
Для этой опции вы запускаете M / R один раз для всех данных.Затем, двигаясь вперед, вы запускаете M / R только для измененных данных.Если у вас есть 200 миллионов документов сейчас, у вас может быть 210 миллионов документов далее (что означает, что M / R становится еще медленнее).Но если вам нужно только запустить новые / измененные документы, то это займет намного меньше 1 часа.
Посмотрите на параметр вывода reduce
в документах здесь .
Опять предпосылка заключается в том, что вы только M / R релевантные данные, и система "реуменьшает" по сравнению с существующими данными.Таким образом, вы получаете «инкрементное» M / R.
Опция № 2: Счетчики реального времени
В этом методе у вас есть две коллекции: одна дляваши данные, секунда для результата "резюме".Когда вы вставляете данные, вы также делаете приращение в сводке.
Предположим, у вас есть эти данные:
Main Collection
{src: 1, dest: 2}
{src: 1, dest: 3}
{src: 1, dest: 10}
{src: 2, dest: 3}
{src: 2, dest: 10}
{src: 4, dest: 3}
Summary Collection
{dest: 3, count: 3}
{dest: 10, count: 2}
{dest: 2, count: 1}
Вы получаете новый фрагмент данных {src: 5, dest: 2}
.Вы сделаете два обновления:
db.main.insert({src: 5, dest: 2});
db.summary.update({dest: 2}, { $inc : { count: 1 } }, true); // upsert true
Вот ваши новые данные:
Main Collection
{src: 1, dest: 2}
...
{src: 4, dest: 3}
{src: 5, dest: 2}
Summary Collection
{dest: 3, count: 3}
{dest: 10, count: 2}
{dest: 2, count: 2}
Вы заметите, что мы обновили наше резюме: {dest: 2, count: 2}
.
Очевидно, что здесь есть компромиссы.Вам нужно больше обновлений / вставок (2 раза), но вы получаете счетчики в реальном времени.Теперь в MongoDB нет транзакций, поэтому вам нужно будет выбрать стратегию для обеспечения того, чтобы оба обновления происходили.Есть много способов сделать это, но я не могу использовать их здесь (см. Очереди сообщений для одного метода).