/ / mongoid: повертає всі вбудовані документи - ruby, mongodb, mongoid

монгоїд: повернути всі вбудовані документи - рубін, мондоб, монгоїд

який найефективніший спосіб повернути всі вбудовані документи?

скажімо, у користувача вбудовано багато Адрес ... в ActiveRecord я міг отримати їх кількість за допомогою Address.count. яка вбудована версія документа / монго це робить?

як щодо того, коли його глибина 2 або більше? Продукт> Преса> Варіації ... як я можу отримати підрахунок усіх глав у всіх книгах, у всіх авторів? як це порівняти з тим, щоб робити все це, скажімо, Рубі?

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

Відповіді:

4 для відповіді № 1

Як каже @maga, Map / Reduce є занадто повільним для агрегування в режимі реального часу, і зберігання поля counts - найкращий спосіб.

Інший варіант - повернути весь документ (або конкретні поля) до вашої програми та проаналізувати його там. Це може бути найкращим, коли ви не знаєте, скільки вкладених рівнів буде існувати.

Незважаючи на те, що деякі люди можуть думати, єабсолютно ніякої шкоди, роблячи це. Сервер баз даних із задоволенням поверне цей документ дуже швидко і дозволить вашій програмі обробляти післяобробку.

Що стосується масштабованості, цей підхід означає, що ви будете масштабувати сервери своїх додатків (які зазвичай набагато доступніші) замість серверів баз даних (які, як правило, дорожчі).


5 для відповіді № 2

Зазвичай це робить агрегація функції (у тому числі карта / зменшити для більш конкретних ситуацій), але вони відносно повільні і не підходять для використання в режимі реального часу у важких програмах. Отже, якщо проблема з продуктивністю, я пропоную додаткові числові поля, оновлені атомні операції коли зміни відбуваються та час від часу змінюються функціями агрегування.


2 для відповіді № 3

Карта / зменшити в MongoDB корисний для пакетної обробки даних та операцій агрегування.