Ако је МапРедуце био ваш избор, сада би могло бити време за прелазак на МонгоДБ-ов агрегациони цевовод за решавање сложених операција.
Цјевовод за агрегацију је препоручени начин за покретање сложених упита у МонгоДБ. Ако сте користили МонгоДБ МапРедуце, боље је да пређете на цевовод за агрегацију ради ефикаснијих израчунавања.
Шта је агрегација у МонгоДБ-у и како функционише?
Агрегациони цевовод је вишестепени процес за напредно покретање упити у МонгоДБ. Он обрађује податке кроз различите фазе које се називају цевовод. Можете користити резултате генерисане са једног нивоа као шаблон за рад на другом.
На пример, можете проследити резултат операције подударања у другу фазу за сортирање тим редоследом док не добијете жељени резултат.
Свака фаза цевовода агрегације садржи МонгоДБ оператор и генерише један или више трансформисаних докумената. У зависности од вашег упита, ниво се може појавити више пута у цевоводу. На пример, можда ћете морати да користите $цоунт или $сорт оператер више пута прелази у цевовод за агрегацију.
Фазе цевовода агрегације
Цјевовод агрегације преноси податке кроз више фаза у једном упиту. Постоји неколико фаза и њихове детаље можете пронаћи у МонгоДБ документација.
Хајде да у наставку дефинишемо неке од најчешће коришћених.
Тхе $матцх Стаге
Ова фаза вам помаже да дефинишете специфичне услове филтрирања пре него што започнете друге фазе агрегације. Можете га користити да изаберете одговарајуће податке које желите да укључите у цевовод за агрегацију.
$гроуп Стаге
Групна фаза раздваја податке у различите групе на основу специфичних критеријума користећи парове кључ/вредност. Свака група представља кључ у излазном документу.
На пример, размотрите следеће продаја примјера података:
Користећи цевовод за агрегацију, можете израчунати укупан број продаје и највећу продају за сваки одељак производа:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
Тхе _ид: $Сецтион пар групише излазни документ на основу секција. Одређивањем топ_салес_цоунт и топ_салес поља, МонгоДБ креира свеже кључеве на основу операције коју дефинише агрегатор; ово може бити $сум, $мин, $мак, или $авг.
$скип фаза
Можете користити $скип фаза да се изостави одређени број докумената у излазу. Обично долази после групне фазе. На пример, ако очекујете два излазна документа, али прескочите један, агрегација ће избацити само други документ.
Да бисте додали фазу прескакања, уметните $скип рад у цевоводу агрегације:
...,
{
$skip: 1
},
$сорт фаза
Фаза сортирања вам омогућава да распоредите податке у опадајућем или растућем редоследу. На пример, можемо даље сортирати податке у претходном примеру упита у опадајућем редоследу да бисмо утврдили који одељак има највећу продају.
Додајте $сорт оператор на претходни упит:
...,
{
$sort: {top_sales: -1}
},
$лимит фаза
Операција ограничења помаже да се смањи број излазних докумената које желите да цевовод за агрегацију прикаже. На пример, користите $лимит оператер да добије одељак са највећом продајом враћен у претходној фази:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Горе наведени враћа само први документ; ово је одељак са највећом продајом, јер се појављује на врху сортираног излаза.
Фаза $пројекта
Тхе $пројецт стаге вам омогућава да обликујете излазни документ како желите. Помоћу $пројецт оператора, можете одредити које поље треба укључити у излаз и прилагодити његово име кључа.
На пример, узорак излаза без $пројецт сцена изгледа овако:
Да видимо како то изгледа са $пројецт фаза. Да бисте додали $пројецт до цевовода:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Пошто смо претходно груписали податке на основу одељака производа, горе наведено укључује сваки одељак производа у излазном документу. Такође осигурава да се збирни број продаје и највећа продаја карактеришу у излазу као ТоталСолд и ТопСале.
Коначни резултат је много чистији у поређењу са претходним:
Тхе $унвинд Стаге
Тхе $унвинд фаза разлаже низ унутар документа на појединачне документе. Узмите следеће Наређења подаци, на пример:
Користити $унвинд фаза за деконструкцију ставке низ пре примене других фаза агрегације. На пример, одмотавање ставке низ има смисла ако желите да израчунате укупан приход за сваки производ:
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",
}
}
])
Ево резултата горњег упита за агрегацију:
Како направити агрегациони цевовод у МонгоДБ-у
Док цевовод за агрегацију укључује неколико операција, претходно представљене фазе вам дају идеју о томе како да их примените у цевоводу, укључујући основни упит за сваку.
Користећи претходни продаја узорак података, нека од горе наведених фаза у једном комаду дамо шири поглед на агрегациони цевовод:
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",
}
}
])
Коначни резултат изгледа као нешто што сте раније видели:
Агрегациони цевовод вс. Карта смањити
До његовог застаревања почевши од МонгоДБ 5.0, конвенционални начин за агрегирање података у МонгоДБ био је преко МапРедуце. Мада МапРедуце има шире апликације осим МонгоДБ-а, мање је ефикасан од цевовода за агрегацију, јер захтева скриптовање треће стране за писање мапе и смањење функција одвојено.
С друге стране, цевовод агрегације је специфичан само за МонгоДБ. Али пружа чистији и ефикаснији начин за извршавање сложених упита. Поред једноставности и скалабилности упита, истакнуте фазе цевовода чине излаз прилагодљивијим.
Има их много више разлике између цевовода за агрегацију и МапРедуце-а. Видећете их док прелазите са МапРедуце на цевовод за агрегацију.
Учините упите великих података ефикасним у МонгоДБ-у
Ваш упит мора бити што је могуће ефикаснији ако желите да покренете дубинске прорачуне на сложеним подацима у МонгоДБ-у. Цевовод за агрегацију је идеалан за напредно постављање упита. Уместо да манипулишете подацима у одвојеним операцијама, што често смањује перформансе, агрегација вам омогућава да их све спакујете у један цевовод са перформансама и извршите их једном.
Иако је цевовод за агрегацију ефикаснији од МапРедуце-а, можете да учините агрегацију бржим и ефикаснијим индексирањем података. Ово ограничава количину података које МонгоДБ треба да скенира током сваке фазе агрегације.