Вот ситуация: у меня есть кластер MongoDB и веб-приложение, которое выполняет довольно интенсивный запрос Map / Reduce.Этот запрос выполняется периодически (каждые 5 минут) в задании cron, и результаты сохраняются (используя $merge
) в коллекции.
Что работает: В настоящее время запрос выполняется для каждогозапись в его коллекции.Указанная коллекция постепенно увеличивается до миллионов строк, и каждый раз, когда она запускается, она занимает немного больше времени.
Очевидное решение состоит в том, чтобы запустить Map / Reduce для новых записей, ииспользуйте функцию уменьшения для старых сохраненных значений, чтобы вычислить правильное значение.MongoDB великолепен, он позволяет вам указать опцию reduce
вместо merge
, чтобы сделать это.
Что я не могу понять: Как правильно выполнить M /R только над новыми записями в исходной коллекции.Я вижу два возможных решения, ни одно из которых не является хорошим.Идеи?
- Я могу пометить записи, которые были обработаны.Проблема в том, как пометить точно те же записи, которые я только что выполнил M / R?
- Я могу запросить соответствующие элементы, а затем передать список идентификаторов в виде запроса
$in: [id1, id2, ...]
в Map / Reduce., а затем отправьте обновление, чтобы установить мой флаг, используя тот же $in
.Но это действительно не элегантно, и я не знаю, как это будет работать, когда список записей огромен.
tl; dr: Как выбрать только новые записи в запросе Map / Reduce, которые превращают его результат в коллекцию.