Сравнение агрегации MongoDB: group (), $ group и MapReduce

Я несколько не понимаю, когда использовать group (), aggregate с $ group или mapreduce. Я прочитал документацию по адресу http://www.mongodb.org/display/DOCS/Aggregation для группы (), http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group для $ group .. Является ли сегментирование единственной ситуацией, когда group () не работает? Кроме того, у меня такое ощущение, что $ group более эффективен, чем group (), потому что его можно использовать вместе с другими операторами конвейера из фреймворка агрегации. Как $ group соотносится с mapreduce? Я где-то читал, что он не генерирует никакой временной коллекции, в отличие от mapreduce. Так ли это?
Может ли кто-нибудь представить иллюстрацию или направить меня по ссылке, где эти три концепции объясняются вместе с использованием одних и тех же данных, чтобы я мог легко их сравнить?

ИЗМЕНИТЬ:
Кроме того, было бы здорово, если бы вы могли указать на что-нибудь новое конкретно в этих командах с момента выхода новой версии 2.2.


person Aafreen Sheikh    schedule 09.09.2012    source источник
comment
Красиво объяснено ... ссылка, которая может помочь, это .... groups.google.com/forum/?fromgroups = #! topic / mongodb-user /   -  person Danish    schedule 28.03.2013
comment
@ user2157221 отличная находка, просто чтобы выделить несколько моментов из обсуждения групп Google: (1) Платформа агрегации может использовать индексы для снижения стоимости операций, когда вас интересует только подмножество содержимого коллекции .; (2) Эквивалентный AF работал в 7 раз быстрее [MR]; (3) С помощью map reduce вы обычно выводите в коллекцию (часто временную коллекцию). Фреймворк агрегации гораздо лучше подходит для возврата данных непосредственно в вызывающую библиотеку, когда вы действительно хотите это сделать.   -  person zamnuts    schedule 06.08.2013


Ответы (1)


Это несколько сбивает с толку, поскольку имена похожи, но group() команда является отличная функция и реализация от $group оператора конвейера в структуре агрегирования.

Команда group (), Aggregation Framework и MapReduce вместе являются функциями агрегирования MongoDB. Возможности частично совпадают, но я попытаюсь объяснить различия и ограничения каждого из них, как в MongoDB 2.2.0.

Примечание. Упомянутые ниже встроенные наборы результатов относятся к запросам, которые обрабатываются в памяти, а результаты возвращаются в конце вызова функции. Альтернативные варианты вывода (в настоящее время доступны только с MapReduce) могут включать сохранение результатов в новую или существующую коллекцию.

group() Команда

  • Простой синтаксис и функциональность для группировки .. аналогично GROUP BY в SQL.

  • Возвращает встроенный набор результатов (как массив сгруппированных элементов).

  • Реализовано с использованием движка JavaScript; пользовательские reduce() функции могут быть написаны на JavaScript.

  • Текущие ограничения

    • Не будет группироваться в результирующий набор с более чем 20 000 ключей.

    • Результаты должны соответствовать ограничениям документа BSON (в настоящее время 16 МБ).

    • Принимает блокировку чтения и не позволяет другим потокам выполнять JavaScript во время его работы.

    • Не работает с сегментированными коллекциями.

  • См. Также: примеры команд group () .

Уменьшение карты

  • Реализует модель MapReduce для обработки больших наборов данных.

  • Можно выбрать один из нескольких вариантов вывода (встроенный, новый сбор, объединение, замена, уменьшение)

  • Функции MapReduce написаны на JavaScript.

  • Поддерживает не сегментированные и сегментированные входные коллекции.

  • Может использоваться для инкрементной агрегации больших коллекций.

  • В MongoDB 2.2 гораздо лучшая поддержка сокращения вывода сегментированных карт.

  • Текущие ограничения

    • Один вывод может содержать только половину максимального размера документа BSON MongoDB (16 МБ).

    • Существует блокировка JavaScript, поэтому сервер mongod может выполнять только одну функцию JavaScript в определенный момент времени .. однако большинство шагов MapReduce очень короткие, поэтому блокировки могут выполняться часто.

    • Функции MapReduce бывает сложно отлаживать. Вы можете использовать print() и printjson(), чтобы включить диагностический вывод в mongod журнал.

    • MapReduce обычно не является интуитивно понятным для программистов, пытающихся преобразовать опыт агрегации реляционных запросов.

  • См. Также: Примеры карты / сокращения .

Структура агрегирования

  • Новая функция в производственном выпуске MongoDB 2.2.0 (август 2012 г.).

  • Разработан с особыми целями повышения производительности и удобства использования.

  • Возвращает встроенный набор результатов.

  • Поддерживает не сегментированные и сегментированные входные коллекции.

  • Использует «конвейерный» подход, при котором объекты преобразуются по мере прохождения через ряд операторов конвейера, таких как сопоставление, проектирование, сортировка и группировка.

  • Операторам конвейера не нужно создавать один выходной документ для каждого входного документа: операторы также могут создавать новые документы или отфильтровывать документы.

  • Используя проекции, вы можете добавлять вычисляемые поля, создавать новые виртуальные подобъекты и извлекать подполя на верхний уровень результатов.

  • Операторы конвейера могут повторяться по мере необходимости (например, несколько $project или $group шагов.

  • Текущие ограничения

    • Результаты возвращаются в виде строки, поэтому они ограничены максимальным размером документа, поддерживаемым сервером (16 МБ).

    • Не поддерживает столько параметров вывода, сколько MapReduce

    • Ограничено операторами и выражениями, поддерживаемыми платформой агрегации (т. Е. Не может писать пользовательские функции)

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

  • См. Также: Примеры структуры агрегирования.

Может ли кто-нибудь представить иллюстрацию или направить меня к ссылке, где эти три концепции объясняются вместе с использованием одних и тех же данных, чтобы я мог легко их сравнить?

Обычно вы не найдете примеров, в которых было бы полезно сравнить все три подхода, но вот предыдущие вопросы StackOverflow, в которых показаны варианты:

person Stennie    schedule 09.09.2012
comment
@Stennie Относительно MapReduce (из документации): (1) внутри функции карты одно излучение может содержать только половину максимального размера документа BSON MongoDB, поэтому MapReduce имеет такие же ограничения размера данных, как $group и group(); см. docs.mongodb. org / manual / reference / method /. (2) mongodb ›= 2.4 позволяет выполнять параллельные операции JavaScript, в то время как более старые версии выполняли код в одном потоке; см. docs.mongodb.org/manual/core/map-reduce/#concurrency - person zamnuts; 06.08.2013
comment
@zamnuts: как явно указано, ответ здесь изначально был написан со ссылкой на MongoDB 2.2.0 (текущая версия на тот момент). С тех пор было много улучшений, поэтому я рекомендую изучить последнюю версию документации на предмет точности, включая Сравнение команд агрегирования (вдохновленное этим ответом!). MongoDB 2.4 имеет улучшенный параллелизм JavaScript, улучшенную производительность Aggregation Framework и новые операторы конвейера агрегации, такие как $geoNear (геопространственное сопоставление). - person Stennie; 12.09.2013
comment
@Stennie, оцените, можете ли вы помочь http://stackoverflow.com/questions/35426213/how-to-group-mongodb-mapreduce-output - person user29578; 16.02.2016