Я немного смущен, когда следует использовать группу(), агрегировать с $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.
Сравнение агрегации MongoDB: group(), $group и MapReduce
Ответ 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, которые показывают варианты: