MongoDB агрегированные данные для генерации «последней активности» - PullRequest
2 голосов
/ 19 ноября 2010

У меня есть коллекция mongodb, в которой есть документы, подобные приведенным ниже:

[
  {
  :event => {:type => 'comment_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d=> 'Fri, 19 Nov 2010'}
  }

,
  {
  :event => {:type => 'vote_created'}, 
  :item  => {:id => 10},
  :created_at => {:t => '11:19:03 +0100 2010', :d => 'Fri, 19 Nov 2010'}
  }
]

Что мне нужно, так это создать «панель мониторинга», объединяющую последние действия (в текущий день) для каждого элемента. Результат должен быть примерно таким:

{
:item_id => 10,
:events => {
  :vote_created => [.. ordered list with latest 3 vote_created events/documents],
  :comment_created => [.. ordered list with latest 3 comment_created events/documents ],
  }
}

Результат будет использован для построения синтаксиса в стиле Facebook, например: «Майк, Джон и еще 3 добавили комментарии к вашему элементу сегодня».

Как я могу агрегировать эти данные, используя группу или функцию уменьшения карты?

Ответы [ 2 ]

4 голосов
/ 19 ноября 2010

ОК, есть два способа сделать это:

Метод № 1: Уменьшение карты

Итак, сначала вы захотите запустить карту -уменьшить, а не группу.

Используйте Map-Reduce с переменной out, которая сгенерирует новую коллекцию.После этого вы сможете выполнять сводные запросы к этой новой коллекции.

Причина, по которой вы это сделаете, заключается в том, что вы запрашиваете дорогой запрос, поэтому гораздо разумнее получить к нему доступ "не совсем "в режиме реального времени".

Метод № 2: Двойная запись

Вы можете в основном поддерживать две коллекции: "подробности" (верхняя) и "сводка"(нижний).Всякий раз, когда вы делаете запись в детали, также выполняйте обновление сводки.

MongoDB имеет несколько методов массива ( $ push, $ pull, $ slice ), которые должны сделать это возможнымчтобы поддерживать массив «poll_created» в актуальном состоянии.

Предпочтения

Выбранный вами метод полностью зависит от типа вашей архитектуры и опыта пользователя, которыйты хочешь.Лично я бы просто использовал метод № 2 и просто продолжал добавлять к массиву «Vote_created».Я бы поместил синтаксис «Майк, Джон и еще 3 ...» где-то в представление, потому что это действительно логика представления, а не логика БД.

Да, метод № 2 занимает больше места, но также даетВы быстрые ответы на вопросы, которые вы задаете много.Так что вам придется пожертвовать пространством, чтобы получить эту скорость.

0 голосов
/ 19 ноября 2010
...