Ja jums ir bijusi MapReduce, tagad varētu būt īstais laiks pāriet uz MongoDB apkopošanas cauruļvadu, lai risinātu sarežģītas darbības.

Apkopošanas cauruļvads ir ieteicamais veids, kā palaist sarežģītus vaicājumus MongoDB. Ja esat izmantojis MongoDB MapReduce, labāk pārslēdzieties uz apkopošanas konveijeru, lai veiktu efektīvākus aprēķinus.

Kas ir apkopošana MongoDB un kā tā darbojas?

Apkopošanas konveijera ir daudzpakāpju process palaišanai uzlabotas vaicājumi MongoDB. Tas apstrādā datus dažādos posmos, ko sauc par cauruļvadu. Varat izmantot vienā līmenī ģenerētos rezultātus kā darbības veidni citā.

Piemēram, varat nodot atbilstības darbības rezultātu uz citu posmu, lai kārtotu šādā secībā, līdz iegūstat vēlamo rezultātu.

Katrā apkopošanas konveijera posmā ir MongoDB operators un tiek ģenerēts viens vai vairāki pārveidoti dokumenti. Atkarībā no jūsu vaicājuma līmenis konveijerā var parādīties vairākas reizes. Piemēram, jums var būt nepieciešams izmantot $count vai $šķirt operatora posmus vairāk nekā vienu reizi pāri apkopošanas cauruļvadam.

instagram viewer

Apkopošanas cauruļvada posmi

Apkopošanas cauruļvads vienā vaicājumā nodod datus vairākos posmos. Ir vairāki posmi, un sīkāku informāciju par tiem varat atrast MongoDB dokumentācija.

Tālāk definēsim dažus no visbiežāk izmantotajiem.

$match posms

Šis posms palīdz definēt konkrētus filtrēšanas nosacījumus pirms citu apkopošanas posmu sākšanas. Varat to izmantot, lai atlasītu atbilstošos datus, kurus vēlaties iekļaut apkopošanas konveijerā.

$grupas posms

Grupas posmā dati tiek sadalīti dažādās grupās, pamatojoties uz konkrētiem kritērijiem, izmantojot atslēgu un vērtību pārus. Katra grupa apzīmē atslēgu izvades dokumentā.

Piemēram, apsveriet tālāk minēto pārdošanu datu paraugi:

Izmantojot apkopošanas konveijeru, varat aprēķināt kopējo pārdošanas apjomu un lielāko pārdošanas apjomu katrai produkta sadaļai.

{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}

The _id: $Sadaļa pārī sagrupē izvaddokumentu, pamatojoties uz sadaļām. Norādot top_sales_count un top_sales laukus, MongoDB izveido jaunas atslēgas, pamatojoties uz agregatora definēto darbību; tas var būt $ summa, $ min, Maks. $, vai $vid.

$skip posms

Jūs varat izmantot $izlaist posmā, lai izvadā izlaistu noteiktu skaitu dokumentu. Parasti tas notiek pēc grupu posma. Piemēram, ja sagaidāt divus izvaddokumentus, bet izlaižat vienu, apkopošana izvadīs tikai otro dokumentu.

Lai pievienotu izlaišanas posmu, ievietojiet $izlaist darbība apkopošanas cauruļvadā:

...,
{
$skip: 1
},

$šķirošanas posms

Kārtošanas posms ļauj sakārtot datus dilstošā vai augošā secībā. Piemēram, mēs varam tālāk kārtot datus iepriekšējā vaicājuma piemērā dilstošā secībā, lai noteiktu, kurā sadaļā ir lielākais pārdošanas apjoms.

Pievienojiet $šķirt operators uz iepriekšējo vaicājumu:

...,
{
$sort: {top_sales: -1}
},

$ limita posms

Ierobežojuma darbība palīdz samazināt izvaddokumentu skaitu, kurus vēlaties rādīt apkopošanas konveijeram. Piemēram, izmantojiet $ limits operators, lai iegūtu sadaļu ar augstākajiem pārdošanas apjomiem, kas atgriezti iepriekšējā posmā:

...,
{
$sort: {top_sales: -1}
},

{"$limit": 1}

Iepriekš minētais atgriež tikai pirmo dokumentu; šī ir sadaļa ar vislielāko pārdošanas apjomu, kā tas ir redzams sakārtotās produkcijas augšdaļā.

$projekta posms

The $projekts posms ļauj veidot izvaddokumentu, kā vēlaties. Izmantojot $projekts operatoru, varat norādīt, kuru lauku iekļaut izvadē, un pielāgot tā atslēgas nosaukumu.

Piemēram, izvades paraugs bez $projekts posms izskatās šādi:

Apskatīsim, kā tas izskatās ar $projekts posms. Lai pievienotu $projekts uz cauruļvadu:

...,

{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",

}
}

Tā kā mēs iepriekš esam grupējuši datus, pamatojoties uz produktu sadaļām, iepriekš norādītajā izvades dokumentā ir iekļauta katra produkta sadaļa. Tas arī nodrošina apkopoto pārdošanas apjomu un populārāko pārdošanas apjomu funkciju izlaidē kā TotalSold un TopSale.

Galīgais rezultāts ir daudz tīrāks salīdzinājumā ar iepriekšējo:

$ unwind Stage

The $atpūsties posms sadala masīvu dokumentā atsevišķos dokumentos. Veikt sekojošo Pasūtījumi dati, piemēram:

Izmantojiet $atpūsties posms, lai dekonstruētu preces masīvs pirms citu apkopošanas posmu piemērošanas. Piemēram, atritinot preces masīvam ir jēga, ja vēlaties aprēķināt kopējos ieņēmumus katram produktam:

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",

}
}
])

Šis ir iepriekš minētā apkopošanas vaicājuma rezultāts:

Kā izveidot apkopošanas cauruļvadu MongoDB

Lai gan apkopošanas konveijerā ir iekļautas vairākas darbības, iepriekš piedāvātie posmi sniedz priekšstatu par to, kā tās lietot konveijerā, tostarp par katras darbības pamata vaicājumu.

Izmantojot iepriekšējo pārdošanu datu paraugs, apskatīsim dažus no iepriekš apspriestajiem posmiem vienā gabalā, lai iegūtu plašāku priekšstatu par apkopošanas konveijeru:

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",

}
}

])

Galīgais rezultāts izskatās kā kaut kas, ko esat redzējis iepriekš:

Apkopošanas cauruļvads vs. MapReduce

Līdz novecošanai, sākot no MongoDB 5.0, parastais veids, kā apkopot datus MongoDB, bija MapReduce. Lai gan MapReduce ir plašākas lietojumprogrammas pārsniedzot MongoDB, tas ir mazāk efektīvs nekā apkopošanas konveijers, tāpēc ir nepieciešams trešās puses skripts, lai atsevišķi uzrakstītu karti un samazinātu funkcijas.

No otras puses, apkopošanas cauruļvads ir raksturīgs tikai MongoDB. Taču tas nodrošina tīrāku un efektīvāku veidu, kā izpildīt sarežģītus vaicājumus. Papildus vienkāršībai un vaicājuma mērogojamībai piedāvātie konveijera posmi padara izvadi daudz pielāgojamāku.

Ir daudz vairāk atšķirības starp apkopošanas cauruļvadu un MapReduce. Jūs tos redzēsit, pārejot no MapReduce uz apkopošanas konveijeru.

Padariet lielo datu vaicājumus efektīvus MongoDB

Jūsu vaicājumam ir jābūt pēc iespējas efektīvākam, ja vēlaties veikt padziļinātus aprēķinus ar sarežģītiem datiem MongoDB. Apkopošanas konveijera ir ideāli piemērota uzlabotai vaicāšanai. Tā vietā, lai manipulētu ar datiem atsevišķās darbībās, kas bieži vien samazina veiktspēju, apkopošana ļauj tos visus ievietot vienā veiktspējas konveijerā un izpildīt vienreiz.

Lai gan apkopošanas konveijera ir efektīvāka nekā MapReduce, varat padarīt apkopošanu ātrāku un efektīvāku, indeksējot savus datus. Tas ierobežo datu apjomu, kas MongoDB jāskenē katrā apkopošanas posmā.