Če ste se že odločili za MapReduce, je zdaj morda čas, da preidete na agregatni cevovod MongoDB za reševanje zapletenih operacij.

Cevovod združevanja je priporočen način za izvajanje kompleksnih poizvedb v MongoDB. Če ste uporabljali MapReduce MongoDB, raje preklopite na cevovod združevanja za učinkovitejše izračune.

Kaj je združevanje v MongoDB in kako deluje?

Cevovod združevanja je večstopenjski proces za napredno izvajanje poizvedbe v MongoDB. Podatke obdeluje skozi različne stopnje, imenovane cevovod. Rezultate, ustvarjene na eni ravni, lahko uporabite kot operacijsko predlogo na drugi.

Rezultat operacije ujemanja lahko na primer posredujete drugi stopnji za razvrščanje v tem vrstnem redu, dokler ne dobite želenega rezultata.

Vsaka stopnja cevovoda združevanja ima operaterja MongoDB in generira enega ali več preoblikovanih dokumentov. Odvisno od vaše poizvedbe se lahko raven v cevovodu pojavi večkrat. Na primer, morda boste morali uporabiti $count oz $sort operater več kot enkrat stopi po cevovodu združevanja.

instagram viewer

Stopnje agregacijskega cevovoda

Cevovod združevanja posreduje podatke skozi več stopenj v eni sami poizvedbi. Obstaja več stopenj in njihove podrobnosti najdete v Dokumentacija MongoDB.

Spodaj opredelimo nekaj najpogosteje uporabljenih.

Oder $match

Ta stopnja vam pomaga definirati posebne pogoje filtriranja, preden začnete z drugimi stopnjami združevanja. Uporabite ga lahko za izbiro ujemajočih se podatkov, ki jih želite vključiti v cevovod združevanja.

$skupinski oder

Skupinska stopnja loči podatke v različne skupine na podlagi posebnih meril z uporabo parov ključ-vrednost. Vsaka skupina predstavlja ključ v izhodnem dokumentu.

Na primer, upoštevajte naslednje prodaja vzorčni podatki:

Z uporabo cevovoda združevanja lahko izračunate skupno število prodaje in najvišjo prodajo za vsak razdelek izdelka:

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

The _id: $odsek par združi izhodni dokument na podlagi odsekov. Z določitvijo top_sales_count in top_sales polja, MongoDB ustvari sveže ključe na podlagi operacije, ki jo definira agregator; to je lahko $vsota, $ min, $maks, oz $povpr.

Oder $skip

Lahko uporabite $preskoči stopnji, da izpustite določeno število dokumentov v izhodu. Ponavadi pride po skupinskem delu. Če na primer pričakujete dva izhodna dokumenta, vendar enega preskočite, bo združevanje izpisalo samo drugi dokument.

Če želite dodati stopnjo preskoka, vstavite $preskoči delovanje v agregacijski cevovod:

...,
{
$skip: 1
},

Stopnja $sort

Stopnja razvrščanja vam omogoča razvrščanje podatkov v padajočem ali naraščajočem vrstnem redu. Podatke v prejšnjem primeru poizvedbe lahko na primer dodatno razvrstimo v padajočem vrstnem redu, da ugotovimo, kateri razdelek ima največjo prodajo.

Dodajte $sort operator na prejšnjo poizvedbo:

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

Faza $limit

Operacija omejitve pomaga zmanjšati število izhodnih dokumentov, ki jih želite prikazati v cevovodu združevanja. Na primer, uporabite $meja operater, da dobi oddelek z največjo prodajo, vrnjeno s prejšnje stopnje:

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

{"$limit": 1}

Zgornje vrne samo prvi dokument; to je razdelek z največjo prodajo, saj je prikazan na vrhu razvrščenega rezultata.

Oder projekta $

The $projekt stopnja vam omogoča, da oblikujete izhodni dokument, kot želite. Uporabljati $projekt lahko določite, katero polje želite vključiti v izpis, in prilagodite njegovo ime ključa.

Na primer, vzorčni rezultat brez $projekt faza izgleda takole:

Poglejmo, kako je videti z $projekt stopnja. Če želite dodati $projekt na cevovod:

...,

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

}
}

Ker smo predhodno združili podatke glede na razdelke izdelkov, zgoraj vključuje vsak razdelek izdelka v izhodnem dokumentu. Zagotavlja tudi, da se skupno število prodaje in najvišja prodaja prikažeta v izhodu kot Skupaj prodano in TopSale.

Končni rezultat je veliko čistejši v primerjavi s prejšnjim:

Oder $unwind

The $odviti stopnja razdeli matriko znotraj dokumenta na posamezne dokumente. Vzemite naslednje Naročila podatki, na primer:

Uporabi $odviti oder za dekonstrukcijo predmete matriko pred uporabo drugih stopenj združevanja. Na primer, odvijanje predmete matrika je smiselna, če želite izračunati skupni prihodek za vsak izdelek:

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

}
}
])

Tukaj je rezultat zgornje poizvedbe združevanja:

Kako ustvariti cevovod združevanja v MongoDB

Medtem ko cevovod združevanja vključuje več operacij, vam prej predstavljene stopnje dajo idejo, kako jih uporabiti v cevovodu, vključno z osnovno poizvedbo za vsako.

Z uporabo prejšnjega prodaja podatkovnega vzorca, poglejmo nekaj zgoraj obravnavanih stopenj v enem kosu za širši pogled na cevovod združevanja:

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

}
}

])

Končni rezultat je videti kot nekaj, kar ste že videli:

Cevovod združevanja vs. MapReduce

Do njegove opustitve, ki se začne z MongoDB 5.0, je bil običajen način združevanja podatkov v MongoDB prek MapReduce. čeprav MapReduce ima širše aplikacije poleg MongoDB je manj učinkovit kot agregacijski cevovod, ki zahteva skripte tretjih oseb za ločeno pisanje zemljevida in zmanjšanje funkcij.

Cevovod združevanja je na drugi strani specifičen samo za MongoDB. Zagotavlja pa čistejši in učinkovitejši način za izvajanje kompleksnih poizvedb. Poleg preprostosti in razširljivosti poizvedbe so predstavljene stopnje cevovoda bolj prilagodljive.

Veliko jih je več razlike med cevovodom združevanja in MapReduce. Videli jih boste, ko preklopite z MapReduce na cevovod združevanja.

Naj bodo poizvedbe po velikih podatkih učinkovite v MongoDB

Vaša poizvedba mora biti čim bolj učinkovita, če želite izvajati poglobljene izračune na kompleksnih podatkih v MongoDB. Cevovod združevanja je idealen za napredno poizvedovanje. Namesto manipuliranja s podatki v ločenih operacijah, kar pogosto zmanjša zmogljivost, vam združevanje omogoča, da jih vse zapakirate v en sam zmogljiv cevovod in jih enkrat izvedete.

Čeprav je cevovod združevanja učinkovitejši od MapReduce, lahko naredite združevanje hitrejše in učinkovitejše z indeksiranjem svojih podatkov. To omejuje količino podatkov, ki jih mora MongoDB pregledati med vsako stopnjo združevanja.