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

Это важно

Вы хотите перенести существующее приложение MongoDB или использовать функции языка запросов MongoDB (MQL)? Рассмотрим Azure DocumentDB.

Вы ищете решение для баз данных для крупномасштабных сценариев с соглашением об уровне обслуживания (SLA) с доступностью 99,999%, мгновенным автомасштабированием и автоматическим переключением на резервные ресурсы в нескольких регионах? Рассмотрим Azure Cosmos DB для NoSQL.

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

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

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

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 лучших категорий по общему объему продаж за указанный диапазон дат.

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