2013-04-21 2 views
3

У меня есть база данных MongoDB с 2 коллекции:MongoDB объединить одно поле в существующую коллекцию с Map/Reduce

  • группы: {group_slug, члены}
  • пользователей: {ID, отображаемое имя, группы}

Все изменения в группах выполняются путем изменения массива элементов группы для включения идентификаторов пользователей.

Я хочу синхронизировать эти изменения в коллекцию пользователей с помощью map/reduce. Как я могу выводить результаты карты/сокращения в существующую коллекцию (но не слияние или сокращение).

Мой существующий код здесь: https://gist.github.com/morgante/5430907

+1

Поскольку MapReduce не может вносить изменения в существующие коллекции или документы, вам нужно сделать это как второй шаг (прочитайте результаты mapreduce и примените их к существующей коллекции). – WiredPrairie

ответ

1

Как выводить результаты карты/уменьшить в существующую коллекцию

Вы действительно не можете сделать это таким образом. И это действительно не рекомендуется. Есть и другие решения:

Решение # 1:

  • Выход карты/уменьшить во временную коллекцию
  • Run прослеживание задача, которая обновляет первичный хранилище данных из временной коллекции
  • Очистка временного сбора

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

Решение # 2:

  • Поместите изменения на очереди. (т. Е. «Пользователь подписывается на группу»)
  • Обновление обеих таблиц от разделения работников, которые слушают такие события в очереди.

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

+0

Спасибо, я закончил с использованием решения 1. –

Смежные вопросы