Како користити цевовод за агрегацију у МонгоДБ-у

Цјевовод за агрегацију је препоручени начин за покретање сложених упита у МонгоДБ. Ако сте користили МонгоДБ МапРедуце, ​​боље је да пређете на цевовод за агрегацију ради ефикаснијих израчунавања.

Шта је агрегација у МонгоДБ-у и како функционише?

Цјевовод агрегације је вишестепени процес за покретање напредних упита у МонгоДБ-у. Он обрађује податке кроз различите фазе које се називају цевовод. Можете користити резултате генерисане са једног нивоа као шаблон за рад на другом.

На пример, можете проследити резултат операције подударања у другу фазу за сортирање тим редоследом док не добијете жељени резултат.

Свака фаза цевовода агрегације садржи МонгоДБ оператор и генерише један или више трансформисаних докумената. У зависности од вашег упита, ниво се може појавити више пута у цевоводу. На пример, можда ћете морати да користите фазе оператора $цоунт или $сорт више пута у цевоводу агрегације.

Фазе цевовода агрегације

Цјевовод агрегације преноси податке кроз више фаза у једном упиту. Постоји неколико фаза и њихове детаље можете пронаћи у МонгоДБ документација.

Хајде да у наставку дефинишемо неке од најчешће коришћених.

Тхе $матцх Стаге

Ова фаза вам помаже да дефинишете специфичне услове филтрирања пре него што започнете друге фазе агрегације. Можете га користити да изаберете одговарајуће податке које желите да укључите у цевовод за агрегацију.

$гроуп Стаге

Групна фаза раздваја податке у различите групе на основу специфичних критеријума користећи парове кључ/вредност. Свака група представља кључ у излазном документу.

На пример, узмите у обзир следеће узорке података о продаји:

Користећи цевовод за агрегацију, можете израчунати укупан број продаје и највећу продају за сваки одељак производа:

 {
$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, конвенционални начин за агрегирање података у МонгоДБ-у био је преко МапРедуце-а. Иако МапРедуце има шире апликације изван МонгоДБ-а, мање је ефикасан од цевовода за агрегацију, јер захтева скриптовање треће стране за писање мапе и смањење функција одвојено.

С друге стране, цевовод агрегације је специфичан само за МонгоДБ. Али пружа чистији и ефикаснији начин за извршавање сложених упита. Поред једноставности и скалабилности упита, истакнуте фазе цевовода чине излаз прилагодљивијим.

Постоји много више разлика између цевовода за агрегацију и МапРедуце-а. Видећете их док прелазите са МапРедуце на цевовод за агрегацију.

Учините упите великих података ефикасним у МонгоДБ-у

Ваш упит мора бити што је могуће ефикаснији ако желите да покренете дубинске прорачуне на сложеним подацима у МонгоДБ-у. Цевовод за агрегацију је идеалан за напредно постављање упита. Уместо да манипулишете подацима у одвојеним операцијама, што често смањује перформансе, агрегација вам омогућава да их све спакујете у један цевовод са перформансама и извршите их једном.

Иако је цевовод за агрегацију ефикаснији од МапРедуце-а, можете да учините агрегацију бржим и ефикаснијим индексирањем података. Ово ограничава количину података које МонгоДБ треба да скенира током сваке фазе агрегације.