mongoid: вернуть все вложенные документы - PullRequest
2 голосов
/ 27 марта 2011

Какой самый эффективный способ вернуть все вложенные документы?

говорят, что у пользователя много встроенных адресов ... в ActiveRecord я могу получить их количество с помощью Address.count. что такое встроенная версия документа / монго?

как насчет того, когда его 2 или более уровней глубоко? Product> Pressing> Variations ... как мне подсчитать все главы по всем книгам, по всем авторам? как бы это сравнить с этим, скажем так, Руби?

Product has_many Pressings
Pressing has_many Variations

Product
  def self.pressings
    all.collect { |p| p.pressings }.flatten
  end
  def self.variations
    self.pressings.collect { |p| p.variations }.flatten
  end
end

Ответы [ 3 ]

5 голосов
/ 27 марта 2011

Обычно это выполняется с помощью функций агрегирования (включая map / Reduce для более конкретных ситуаций), но они относительно медленные и не подходят для использования в реальном времени в тяжелых приложениях. Итак, если производительность является проблемой, я предлагаю дополнительные числовые поля, обновляемые атомарными операциями , когда происходят изменения и время от времени исправляются функциями агрегации.

4 голосов
/ 28 марта 2011

Как говорит @maga, Map / Reduce слишком медленный для агрегации в реальном времени, и хранение поля подсчета является лучшим способом.

Другой вариант - вернуть весь документ (или определенные поля) в ваше приложение и проанализировать его там.Это может быть лучше, когда вы не знаете, сколько будет существовать вложенных уровней.

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

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

2 голосов
/ 27 марта 2011

Отображение / уменьшение в MongoDB полезно для пакетной обработки данных и операций агрегирования.

...