Поделиться через


Начало работы с конвейером агрегирования

Конвейер агрегирования — это мощное средство, позволяющее разработчикам выполнять расширенный анализ данных и манипулирование их коллекциями. Конвейер — это последовательность операций обработки данных, выполняемых на входных документах для создания вычисляемых выходных данных. Этапы конвейера обрабатывают входные документы и передают результат на следующий этап. Каждый этап выполняет определенную операцию по данным, например фильтрацию, группирование, сортировку и преобразование.

Базовый синтаксис

Базовый синтаксис для конвейера агрегирования выглядит следующим образом:

db.collection.aggregate([    { stage1 },    { stage2 },    ...    { stageN }])

Где db.collection — это коллекция MongoDB, на которой вы хотите выполнить агрегирование, и этап1, этап2, ..., stageN — это этапы конвейера, которые необходимо применить.

Пример этапов

Cosmos DB для MongoDB предоставляет широкий спектр этапов, которые можно использовать в конвейере, включая:

  • $match. Фильтрует документы, чтобы передать только те документы, которые соответствуют указанному условию.
  • $project. Преобразует документы в новую форму, добавляя, удаляя или обновляя поля.
  • $group. Группирует документы по одному или нескольким полям и выполняет различные агрегатные функции для сгруппированных данных.
  • $sort. Сортирует документы на основе указанных полей.
  • $skip. Пропускает указанное количество документов.
  • $limit. Ограничивает количество документов, передаваемых на следующий этап.
  • $unwind. Деконструкция поля массива из входных документов для вывода документа для каждого элемента.

Просмотр всех доступных этапов см. в разделе поддерживаемых функций

Примеры

Ниже приведены некоторые примеры использования конвейера агрегирования для выполнения различных операций с данными:

Фильтрация. Чтобы отфильтровать документы с полем "количество", превышающее 20, можно использовать следующий конвейер:

db.collection.aggregate([
    { $match: { quantity: { $gt: 20 } } }
])

Группирование. Чтобы сгруппировать документы по полю "категория" и вычислить общее "количество" для каждой группы, можно использовать следующий конвейер:

db.collection.aggregate([
    { $group: { _id: "$category", totalQuantity: { $sum: "$quantity" } } }
])

Сортировка: чтобы сортировать документы по полю "price" в порядке убывания, можно использовать следующий конвейер:

db.collection.aggregate([
    { $sort: { price: -1 } }
])

Преобразование. Чтобы добавить новое поле "скидка" в документы с "ценой" больше 100, можно использовать следующий конвейер:

db.collection.aggregate([
    { $project: { item: 1, price: 1, discount: { $cond: [{ $gt: ["$price", 100] }, 10, 0 ] } } }
])

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

db.collection.aggregate([
    { $unwind: "$tags" }
])

Пример с несколькими этапами

db.sales.aggregate([
  { $match: { date: { $gte: "2021-01-01", $lt: "2021-03-01" } } },
  { $group: { _id: "$category", totalSales: { $sum: "$sales" } } },
  { $sort: { totalSales: -1 } },
  { $limit: 5 }
])

В этом примере мы используем пример коллекции с именем sales, в которой есть документы со следующими полями: date, Category и Sales.

Первый этап { $match: { дата: { $gte: "2021-01-01", $lt: "2021-03-01" } } фильтрует документы по полю "дата", передавая документы только с датой между 1 января 2021 г. и 28 февраля 2021 г. Мы используем формат строковой даты с форматом YYYY-MM-DD.

Второй этап { $group: { _id: "$category", totalSales: { $sum: "$sales" } } группирует документы по полю "категория" и вычисляет общий объем продаж для каждой группы.

Третий этап { $sort: { totalSales: -1 } } сортирует документы по полю totalSales в порядке убывания.

Четвертый этап { $limit: 5 } ограничивает количество документов, передаваемых на следующий этап, только к верхней 5.

В результате конвейер вернет первые 5 категорий по общему объему продаж для указанного диапазона дат.

Следующие шаги