Серия MongoDB — глубокое понимание агрегации MongoDB (агрегации)

MongoDB

  Совокупность в 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 может использоваться для обработки данных, которую можно адаптировать для некоторого анализа данных и т. д. Типичные приложения агрегирования включают бизнес-отчеты данных о продажах, такие как группировка данных в различных регионах для расчета общего объема продаж, финансовые отчеты. , и т.д. В конце концов, если вы хотите получить более глубокое понимание, вам нужно практиковать это самостоятельно.

Наконец, вы можете обратить внимание на общедоступную учетную запись, учиться вместе, делиться галантереей каждый день и получать обучающее видео галантереи!