Если вы предпочитаете MapReduce, возможно, сейчас самое время перейти на конвейер агрегации MongoDB для выполнения сложных операций.
Конвейер агрегации — рекомендуемый способ выполнения сложных запросов в MongoDB. Если вы использовали MapReduce MongoDB, вам лучше переключиться на конвейер агрегации для более эффективных вычислений.
Что такое агрегация в MongoDB и как она работает?
Конвейер агрегации представляет собой многоэтапный процесс запуска расширенных запросы в MongoDB. Он обрабатывает данные на разных этапах, называемых конвейером. Вы можете использовать результаты, полученные на одном уровне, в качестве шаблона операции на другом.
Например, вы можете передать результат операции сопоставления на другой этап для сортировки в этом порядке, пока не получите желаемый результат.
На каждом этапе конвейера агрегации используется оператор MongoDB, который генерирует один или несколько преобразованных документов. В зависимости от вашего запроса уровень может появляться в конвейере несколько раз. Например, вам может понадобиться использовать
$счет или $сортировать оператор выполняет несколько этапов по конвейеру агрегации.Этапы конвейера агрегации
Конвейер агрегации передает данные через несколько этапов в одном запросе. Существует несколько этапов, и вы можете найти их подробности в Документация MongoDB.
Давайте определим некоторые из наиболее часто используемых из них ниже.
Этап $match
Этот этап помогает вам определить конкретные условия фильтрации перед запуском других этапов агрегирования. Вы можете использовать его для выбора соответствующих данных, которые вы хотите включить в конвейер агрегации.
$групповой этап
На групповом этапе данные разделяются на разные группы на основе определенных критериев с использованием пар ключ-значение. Каждая группа представляет ключ в выходном документе.
Например, рассмотрим следующее продажи Пример данных:
Используя конвейер агрегации, вы можете вычислить общее количество продаж и самые высокие продажи для каждого раздела продукта:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
_id: $Раздел Пара группирует выходной документ по разделам. Указав top_sales_count и top_sales поля MongoDB создает новые ключи на основе операции, определенной агрегатором; это может быть $сумма, $мин, $макс., или $авг.
Этап $skip
Вы можете использовать $пропустить этап, чтобы пропустить указанное количество документов в выходных данных. Обычно это происходит после группового этапа. Например, если вы ожидаете два выходных документа, но пропускаете один, агрегация выведет только второй документ.
Чтобы добавить этап пропуска, вставьте $пропустить операция в конвейере агрегации:
...,
{
$skip: 1
},
Этап $sort
Этап сортировки позволяет упорядочить данные в порядке убывания или возрастания. Например, мы можем дополнительно отсортировать данные из предыдущего примера запроса в порядке убывания, чтобы определить, в каком разделе самые высокие продажи.
Добавить $сортировать оператор предыдущего запроса:
...,
{
$sort: {top_sales: -1}
},
Этап $limit
Операция ограничения помогает уменьшить количество выходных документов, которые должен отображать конвейер агрегации. Например, используйте лимит $ оператор, чтобы получить раздел с наибольшими продажами, полученными на предыдущем этапе:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Вышеупомянутое возвращает только первый документ; это раздел с самыми высокими продажами, поскольку он отображается вверху отсортированных результатов.
Этап $проекта
$проект Этап позволяет вам формировать выходной документ по своему усмотрению. Используя $проект Оператор вы можете указать, какое поле включить в выходные данные, и настроить его ключевое имя.
Например, пример вывода без $проект этап выглядит так:
Давайте посмотрим, как это выглядит с $проект этап. Чтобы добавить $проект к трубопроводу:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Поскольку ранее мы сгруппировали данные по разделам продуктов, приведенное выше включает каждый раздел продукта в выходной документ. Это также гарантирует, что совокупное количество продаж и самые высокие продажи будут отображаться в выходных данных как Всего продано и ТопРаспродажа.
Окончательный результат намного чище по сравнению с предыдущим:
Этап $unwind
$расслабиться Этап разбивает массив внутри документа на отдельные документы. Возьмите следующее Заказы данные, например:
Использовать $расслабиться этап деконструкции предметы массив перед применением других этапов агрегации. Например, раскручивая предметы Массив имеет смысл, если вы хотите вычислить общий доход для каждого продукта:
db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",
}
}
])
Вот результат приведенного выше запроса агрегирования:
Как создать конвейер агрегации в MongoDB
Хотя конвейер агрегации включает в себя несколько операций, ранее рассмотренные этапы дают представление о том, как их применять в конвейере, включая базовый запрос для каждой.
Используя предыдущий продажи образец данных, давайте объединим некоторые из этапов, описанных выше, в одну часть, чтобы получить более широкое представление о конвейере агрегации:
db.sales.aggregate([
{
"$match": {
"Sold": { "$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 5.0, обычным способом агрегирования данных в MongoDB было использование MapReduce. Хотя MapReduce имеет более широкое применение за пределами MongoDB он менее эффективен, чем конвейер агрегации, и требует сторонних сценариев для написания карты и функций сокращения по отдельности.
С другой стороны, конвейер агрегации специфичен только для MongoDB. Но он обеспечивает более чистый и эффективный способ выполнения сложных запросов. Помимо простоты и масштабируемости запросов, представленные этапы конвейера делают выходные данные более настраиваемыми.
Есть еще много различия между конвейером агрегации и MapReduce. Вы увидите их при переключении с MapReduce на конвейер агрегации.
Сделайте запросы к большим данным эффективными в MongoDB
Ваш запрос должен быть максимально эффективным, если вы хотите выполнить глубокие вычисления над сложными данными в MongoDB. Конвейер агрегации идеально подходит для расширенных запросов. Вместо того, чтобы манипулировать данными в отдельных операциях, что часто снижает производительность, агрегирование позволяет упаковать их все в один производительный конвейер и выполнить их один раз.
Хотя конвейер агрегации более эффективен, чем MapReduce, вы можете сделать агрегацию быстрее и эффективнее, индексируя свои данные. Это ограничивает объем данных, которые MongoDB необходимо сканировать на каждом этапе агрегации.