Подтвердить что ты не робот

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

Я немного смущен, когда следует использовать группу(), агрегировать с $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. Это так? Может ли кто-нибудь представить иллюстрацию или привести меня к ссылке, где эти три понятия объясняются вместе, взяв те же данные образца, чтобы я мог их легко сравнивать?

EDIT:
Также было бы замечательно, если бы вы могли указать что-то новое в этих командах, так как вышел новый релиз 2.2.

4b9b3361

Ответ 1

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

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

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

group() Команда

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

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

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

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

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

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

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

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

  • См. также: примеры команд группы().

MapReduce

  • Реализует модель 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, которые показывают варианты: