Как использовать конвейер агрегации в MongoDB
Конвейер агрегирования — рекомендуемый способ выполнения сложных запросов в MongoDB. Если вы используете MapReduce MongoDB, лучше всего переключиться на конвейер агрегации для более эффективных вычислений.
Что такое конвейер агрегации в MongoDB?
Конвейер агрегации — это многоэтапный процесс, который выполняет сложные запросы в MongoDB. Он обрабатывает данные на разных этапах, называемых конвейерами. Вы можете использовать результаты, полученные на уровне, в качестве рабочей выборки.
Например, вы можете передать результаты операции сопоставления на другой этап, чтобы сортировать их, пока не получите желаемый результат.
Каждый этап конвейера агрегации включает оператор MongoDB и создает один или несколько преобразованных документов. В зависимости от вашего запроса уровень может появляться в процессе несколько раз. Например, вам может потребоваться несколько раз использовать этапы оператора $count или $sort в процессе агрегирования.
Этапы конвейера агрегации
Конвейер агрегации передает данные через несколько этапов в одном запросе. Подробную информацию о некоторых этапах арбитража документов можно найти в MongoDB.
Ниже приведены некоторые из наиболее распространенных этапов.
$соответствие. этап
Этот этап помогает вам определить конкретные условия фильтрации перед началом других этапов синтеза. Вы можете использовать его для выбора соответствующих данных, которые вы хотите включить в процесс агрегирования.
$группа. этап
На этапе группировки данные разделяются на разные группы на основе определенных критериев с использованием пар ключ-значение. Каждая группа представляет ключ в выходном документе.
Например, рассмотрим следующие примеры данных о продажах:
Используя конвейер агрегации, вы можете рассчитать общий объем продаж и пиковые продажи для каждой группы продуктов:
{ $group: { _id: $Section, total_sales_count: {$sum : $Sold}, top_sales: {$max: $Amount}, } }
Пара _id:$Section группирует выходной документ по разделам. Указывая поля top_sale_count и top_sale, MongoDB генерирует новые ключи на основе активности, определенной агрегатором; это может быть $sum, $min, $max или $avg.
$пропустить. этап
Вы можете использовать этап $skip, чтобы пропустить указанное количество документов в выходных данных. Обычно это происходит после группового этапа. Например, если вы ожидаете два выходных документа, но игнорируете один, агрегация выведет только второй документ.
Чтобы добавить этап пропуска, вставьте оператор $skip в конвейер агрегации:
., { $skip: 1 },
$этап сортировки
Этап сортировки позволяет сортировать данные по убыванию или возрастанию. Например, отсортируйте данные из предыдущего примера запроса в порядке убывания, чтобы решить, в каком разделе самые высокие продажи.
Добавьте оператор $sort в предыдущий запрос:
., { $sort: {top_sales: -1} },
лимит $. этап
Оператор ограничения уменьшает количество выходных документов, которые должен отображать конвейер агрегации. Например, используйте оператор $limit, чтобы получить наибольшую часть дохода, полученную за предыдущий период:
., { $sort: {top_sales: -1} }, {“$limit”: 1}
Результаты возвращают только первый документ, который имеет наибольший объем продаж, поскольку он отображается вверху результатов с разбивкой по категориям.
$проект. этап
Фаза $project позволяет вам придать результирующему документу желаемую форму. Используя оператор $project, вы можете указать поле, которое будет включено в результат, и настроить его ключевое имя.
Например, пример вывода без фазы $project выглядит так:
Давайте посмотрим, как это выглядит в сочетании со стадией $project. Чтобы добавить $project в конвейер:
., { “$project”: { “_id”: 0, “Section”: “$_id”, “TotalSold”: “$total_sales_count”, “TopSale”: “$top_sales”, } }
Поскольку мы разгруппировали данные по частям продукта, приведенные выше данные включают каждую часть продукта в выходной документ. Это также гарантирует, что агрегированные показатели продаж и основные функции продаж в выходных данных будут TotalSold и TopSale .
Конечный результат намного компактнее, чем в предыдущей версии:
Как создать конвейер агрегации в MongoDB
Хотя процесс агрегации включает в себя несколько операций, ранее выделенные этапы дают представление о том, как их применять в процессе, включая базовый запрос для каждой операции.
Используя предыдущий образец данных о продажах, давайте синтезируем некоторые из рассмотренных выше этапов, чтобы лучше понять конвейер агрегации в MongoDB:
db.sales.aggregate(( { “$match”: { “Продано”: { “$gte”: 5 } } }, { “$group”: { “_id”: “$Section”, “total_sales_count”: { “$sum”: “$Sold” }, “top_sales”: { “$max”: “$Amount” }, } }, { “$sort”: { “top_sales”: -1 } }, {“$skip “: 0}, { “$project”: { “_id”: 0, “Section”: “$_id”, “TotalSold”: “$total_sales_count”, “TopSale”: “$top_sales”, } } ))
Результат:
Выше описано, как использовать конвейер агрегации в MongoDB. Надеюсь, статья окажется для вас полезной.