Атомность в Map / Сокращение по новым записям (MongoDB) - PullRequest
3 голосов
/ 30 июня 2011

Вот ситуация: у меня есть кластер MongoDB и веб-приложение, которое выполняет довольно интенсивный запрос Map / Reduce.Этот запрос выполняется периодически (каждые 5 минут) в задании cron, и результаты сохраняются (используя $merge) в коллекции.

Что работает: В настоящее время запрос выполняется для каждогозапись в его коллекции.Указанная коллекция постепенно увеличивается до миллионов строк, и каждый раз, когда она запускается, она занимает немного больше времени.

Очевидное решение состоит в том, чтобы запустить Map / Reduce для новых записей, ииспользуйте функцию уменьшения для старых сохраненных значений, чтобы вычислить правильное значение.MongoDB великолепен, он позволяет вам указать опцию reduce вместо merge, чтобы сделать это.

Что я не могу понять: Как правильно выполнить M /R только над новыми записями в исходной коллекции.Я вижу два возможных решения, ни одно из которых не является хорошим.Идеи?

  1. Я могу пометить записи, которые были обработаны.Проблема в том, как пометить точно те же записи, которые я только что выполнил M / R?
  2. Я могу запросить соответствующие элементы, а затем передать список идентификаторов в виде запроса $in: [id1, id2, ...] в Map / Reduce., а затем отправьте обновление, чтобы установить мой флаг, используя тот же $in.Но это действительно не элегантно, и я не знаю, как это будет работать, когда список записей огромен.

tl; dr: Как выбрать только новые записи в запросе Map / Reduce, которые превращают его результат в коллекцию.

1 Ответ

2 голосов
/ 30 июня 2011

Добрая душа на IRC-канале #mongodb помогла мне понять это. Простое решение состоит в том, чтобы иметь поле конечного автомата и выполнить следующее (в псевдокоде):

set {state:'processing'} where {state:{$exists:false}}
mapreduce {...} where {state:'processing'}
set {state:'done'} where {state:'processing'}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...