Совокупность в MongoDBОперация объединяет значения из нескольких документов и обрабатывает сгруппированные данные, выполняя различные операции, и возвращает результаты расчетных данных, которые в основном используются для обработки данных (например, статистическое среднее, суммирование и т. д.). MongoDB предоставляет три способа выполнения операций агрегирования:конвейер агрегации,Функция Map-Reduceа такжеЕдиная команда агрегации (количество, отдельные, групповые).
1. Конвейер агрегации
1.1 Конвейер агрегации
Конвейер агрегации — это конвейер, состоящий из нескольких этапов с помощью платформы агрегирования, которая может группировать и фильтровать конвейер каждого этапа, а затем выводить соответствующие результаты агрегирования после серии обработки. как показано на рисунке:
Операции конвейера агрегации:
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
- Стадия $match: отфильтровать подходящие документы через поле статуса (то есть документы, статус которых равен «A»);
- ** $group stage: сгруппируйте документ по полю cust_id, чтобы вычислить сумму суммы для каждого уникального cust_id. **
1.2 Трубы
конвейер обычно используется в Unix и Linux для использования вывода текущей команды в качестве параметра следующей команды Конвейер агрегации MongoDB обрабатывает документы MongoDB в одном конвейере и передает результат в следующий конвейер для обработки. Конвейерные операции повторяемы.
Предоставление самых основных функций конвейерафильтр фильтр, который работает как запрос и преобразование документа и изменяет форму выходного документа.
Другие конвейерные операции предоставляют инструменты для группировки и сортировки документов по определенному полю или полям, а также для агрегирования содержимого массивов, включая массивы документов. Кроме того, этапы конвейера могут использовать операторы для выполнения таких задач, как вычисление средних значений или объединение строк. Обобщенно следующим образом:
оператор трубы
Обычно используемые трубы | Разобрать |
---|---|
$group | Сгруппируйте документы в коллекции, которые можно использовать для получения статистических результатов. |
$match | Фильтровать данные, чтобы выводить только те документы, которые соответствуют результатам |
$project | Изменить структуру входного документа (например, переименовать, добавить, удалить поля, создать результаты расчета и т. д.) |
$sort | Сортировка результатов и вывод |
$limit | Ограничьте количество результатов, выводимых конвейером |
$skip | Пропустить указанное количество результатов и вернуть остальные результаты |
$unwind | Разделить поля типа массива |
оператор выражения
Общие выражения | значение |
---|---|
$sum | Вычислить сумму, {$sum: 1} означает вернуть значение суммы × 1 (то есть количество сумм) и использовать {$sum: '$specify field'} для прямого получения суммы значений указанного поля |
$avg | средний |
$min | Найдите минимальное значение |
$max | Найдите максимальное значение |
$push | Вставить значения из полученного документа в массив |
$first | Получить данные первого документа в соответствии с порядком документов |
$last | Аналогично получить последние данные |
Для простоты понимания сравните общие операции агрегации монго с запросами MySql:
Операции агрегации MongoDB | Операция/функция MySql |
---|---|
$match | where |
$group | group by |
$match | having |
$project | select |
$sort | order by |
$limit | лимит |
$sum | sum() |
$lookup | join |
1.3 Оптимизация конвейера агрегации
- Конвейер агрегации может определить, требуется ли ему только подмножество полей в документе для получения результата. Если это так, конвейер будет использовать только те обязательные поля, что уменьшит объем данных, проходящих через конвейер.
-
Оптимизация последовательности конвейера
Оптимизация последовательности конвейера:
1) Используйте оптимизацию последовательности $projector/$addFields+$match: при наличии нескольких этапов $projectior/$addFields и этапов $match в конвейере агрегации сначала будет выполняться зависимый этап $projector/$addFields, а затем новый один будет создан Этап $match выполняется следующим образом:
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: {
name: "Joe Schmoe",
maxTime: { $lt: 20 },
minTime: { $gt: 5 },
avgTime: { $gt: 7 }
} }
Оптимизированное исполнение:
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
2) $sort + $match и $project + $skip, когда $sort/$project следует за $match/$skip, $match/$skip будет выполняться перед $sort/$project, $sort Чтобы минимизировать количество объекты, которые необходимо упорядочить, ограничение $skip выглядит следующим образом:
{ $sort: { age : -1 } },
{ $match: { score: 'A' } }
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
Оптимизированное исполнение:
{ $match: { score: 'A' } },
{ $sort: { age : -1 } }
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
3) Последовательность $redact+$match оптимизирована. Когда есть $match после $redact, для оптимизации может быть создан новый этап $match следующим образом:
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "?PRUNE", else: "?DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
Оптимизированное исполнение:
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "?PRUNE", else: "?DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
Есть также много оптимизаций последовательности конвейера для просмотраОфициальная документация - Оптимизация конвейера агрегации".
1.4 Конвейер агрегации и сегментированные коллекции
Если конвейер начинается с ключа $match точного сегмента, все конвейеры будут выполняться на соответствующем сегменте. Для операций агрегации, которые необходимо выполнять в нескольких сегментах, если их не нужно выполнять на основном сегменте, результаты этих операций будут направляться в случайные сегменты для объединения результатов, чтобы избежать перегрузки базы данных основного сегмента. Этапы $out и $look должны выполняться в основной базе данных сегмента.
2. Функция уменьшения карты
MongoDB также предоставляет операции уменьшения карты для выполнения агрегирования. как правило,Операция уменьшения карты состоит из двух фаз.:этап карты, который обрабатывает каждый документ и создает один или несколько объектов для каждого входного документа, иуменьшить этапОбъединяет выходные данные операции карты. Опционально map-reduce может иметь стадию завершения для внесения окончательных изменений в результаты. Как и другие операции агрегирования, map-reduce может задавать условия запроса для выбора входных документов, а также для сортировки и ограничения результатов.
Map-reduce использует пользовательские функции JavaScript для выполнения операций сопоставления и редукции, а также дополнительную операцию финализации. Хотя пользовательский JavaScript обеспечивает большую гибкость по сравнению с конвейерами агрегации, в целом map-reduce менее эффективен и более сложен, чем конвейеры агрегации. Схема выглядит следующим образом:
3. Единая команда агрегации
MongoDB также предоставляет db.collection.estimatedDocumentCount(), db.collection.count() и db.collection.distinct(). Все эти единые агрегатные команды. Хотя эти операции обеспечивают простой доступ к общим процессам агрегации, им не хватает гибкости и мощности конвейеров агрегации и уменьшения карты. Модель выглядит следующим образом
Суммировать
Операция агрегирования в MongoDB может использоваться для обработки данных, которую можно адаптировать для некоторого анализа данных и т. д. Типичные приложения агрегирования включают бизнес-отчеты данных о продажах, такие как группировка данных в различных регионах для расчета общего объема продаж, финансовые отчеты. , и т.д. В конце концов, если вы хотите получить более глубокое понимание, вам нужно практиковать это самостоятельно.
Наконец, вы можете обратить внимание на общедоступную учетную запись, учиться вместе, делиться галантереей каждый день и получать обучающее видео галантереи!