Я несколько не понимаю, когда использовать 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.
Сравнение агрегации MongoDB: group (), $ group и MapReduce
Ответы (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 () strong >.
Уменьшение карты
Реализует модель 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, в которых показаны варианты:
$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
$geoNear
(геопространственное сопоставление).
- person Stennie; 12.09.2013