Если вы предпочитаете MapReduce, возможно, сейчас самое время перейти на конвейер агрегации MongoDB для выполнения сложных операций.

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

Что такое агрегация в MongoDB и как она работает?

Конвейер агрегации представляет собой многоэтапный процесс запуска расширенных запросы в MongoDB. Он обрабатывает данные на разных этапах, называемых конвейером. Вы можете использовать результаты, полученные на одном уровне, в качестве шаблона операции на другом.

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

На каждом этапе конвейера агрегации используется оператор MongoDB, который генерирует один или несколько преобразованных документов. В зависимости от вашего запроса уровень может появляться в конвейере несколько раз. Например, вам может понадобиться использовать

instagram viewer
$счет или $сортировать оператор выполняет несколько этапов по конвейеру агрегации.

Этапы конвейера агрегации

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