Ako je MapReduce bio vaš izbor, sada bi moglo biti vrijeme da prijeđete na MongoDB-ov agregacijski cjevovod za rješavanje složenih operacija.
Cjevovod agregacije je preporučeni način za pokretanje složenih upita u MongoDB-u. Ako ste koristili MongoDB-ov MapReduce, bolje se prebacite na agregacijski cjevovod za učinkovitije proračune.
Što je agregacija u MongoDB-u i kako radi?
Cjevovod agregacije je višefazni proces za napredno pokretanje upite u MongoDB-u. Obrađuje podatke kroz različite faze koje se nazivaju cjevovod. Rezultate generirane s jedne razine možete koristiti kao operativni predložak na drugoj.
Na primjer, možete proslijediti rezultat operacije podudaranja u drugu fazu za sortiranje tim redoslijedom dok ne dobijete željeni rezultat.
Svaki stupanj cjevovoda agregacije ima MongoDB operatora i generira jedan ili više transformiranih dokumenata. Ovisno o vašem upitu, razina se može pojaviti više puta u cjevovodu. Na primjer, možda ćete morati upotrijebiti $count ili $sortirati operater prelazi više od jednom preko cjevovoda agregacije.
Faze cjevovoda agregacije
Cjevovod agregacije prolazi podatke kroz više faza u jednom upitu. Postoji nekoliko faza, a njihove detalje možete pronaći u MongoDB dokumentacija.
Definirajmo neke od najčešće korištenih u nastavku.
Pozornica $match
Ova faza vam pomaže definirati specifične uvjete filtriranja prije pokretanja drugih faza agregacije. Možete ga koristiti za odabir podudarnih podataka koje želite uključiti u cjevovod združivanja.
$grupna faza
Grupna faza razdvaja podatke u različite grupe na temelju specifičnih kriterija pomoću parova ključ-vrijednost. Svaka grupa predstavlja ključ u izlaznom dokumentu.
Na primjer, razmotrite sljedeće prodajni ogledni podaci:
Koristeći agregacijski cjevovod, možete izračunati ukupan broj prodaje i najveću prodaju za svaki odjeljak proizvoda:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
The _id: $Odjeljak par grupira izlazni dokument na temelju odjeljaka. Određivanjem top_sales_count i top_sales polja, MongoDB stvara nove ključeve na temelju operacije definirane od strane agregatora; ovo može biti $sum, $min, $maks, ili $prosj.
Faza $skip
Možete koristiti $preskoči fazi za izostavljanje određenog broja dokumenata u izlazu. Obično dolazi nakon grupne faze. Na primjer, ako očekujete dva izlazna dokumenta, ali preskočite jedan, združivanje će ispisati samo drugi dokument.
Da biste dodali fazu preskakanja, umetnite $preskoči rad u cjevovodu agregacije:
...,
{
$skip: 1
},
Faza $sort
Faza razvrstavanja omogućuje vam raspoređivanje podataka silaznim ili uzlaznim redoslijedom. Na primjer, možemo dalje sortirati podatke u prethodnom primjeru upita silaznim redoslijedom kako bismo odredili koji odjeljak ima najveću prodaju.
Dodajte $sortirati operator na prethodni upit:
...,
{
$sort: {top_sales: -1}
},
Faza $limit
Operacija ograničenja pomaže smanjiti broj izlaznih dokumenata koje želite da cjevovod združivanja prikaže. Na primjer, koristite $ograničenje operator da dobije odjeljak s najvećom prodajom vraćen prethodnom fazom:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Gore navedeno vraća samo prvi dokument; ovo je odjeljak s najvećom prodajom, jer se pojavljuje na vrhu sortiranog rezultata.
Faza $projekta
The $projekt stage vam omogućuje da oblikujete izlazni dokument kako želite. Koristiti $projekt operatora, možete odrediti koje polje uključiti u izlaz i prilagoditi naziv ključa.
Na primjer, ogledni izlaz bez $projekt faza izgleda ovako:
Pogledajmo kako to izgleda s $projekt pozornici. Da biste dodali $projekt na cjevovod:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Budući da smo prethodno grupirali podatke na temelju odjeljaka proizvoda, gore navedeno uključuje svaki odjeljak proizvoda u izlaznom dokumentu. Također osigurava da se agregirani broj prodaje i najveća prodaja značajke u izlazu kao Ukupno prodano i TopSale.
Konačni rezultat je puno čišći u usporedbi s prethodnim:
Pozornica $unwind
The $odmotati faza rastavlja niz unutar dokumenta u pojedinačne dokumente. Uzmite sljedeće Narudžbe podatke, na primjer:
Koristiti $odmotati faza za dekonstrukciju stavke niz prije primjene drugih stupnjeva agregacije. Na primjer, odmotavanje stavke niz ima smisla ako želite izračunati ukupni prihod za svaki proizvod:
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",
}
}
])
Evo rezultata gornjeg agregacijskog upita:
Kako stvoriti agregacijski cjevovod u MongoDB-u
Iako cjevovod agregacije uključuje nekoliko operacija, prethodno prikazane faze daju vam ideju kako ih primijeniti u cjevovodu, uključujući osnovni upit za svaki.
Koristeći prethodni prodajni uzorka podataka, neka su neke od gore razmotrenih faza u jednom dijelu za širi pogled na cjevovod agregacije:
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",
}
}
])
Konačni rezultat izgleda kao nešto što ste već vidjeli:
Cjevovod agregacije vs. MapReduce
Sve do zastarevanja počevši od MongoDB 5.0, konvencionalni način prikupljanja podataka u MongoDB bio je putem MapReducea. Iako MapReduce ima šire primjene osim MongoDB-a, manje je učinkovit od agregacijskog cjevovoda, zahtijevajući skriptiranje treće strane za odvojeno pisanje mape i smanjivanje funkcija.
Cjevovod agregacije, s druge strane, specifičan je samo za MongoDB. Ali pruža čišći i učinkovitiji način za izvršavanje složenih upita. Osim jednostavnosti i skalabilnosti upita, istaknuti stupnjevi cjevovoda čine izlaz prilagodljivijim.
Ima ih mnogo više razlike između cjevovoda agregacije i MapReducea. Vidjet ćete ih dok se prebacujete s MapReduce na agregacijski cjevovod.
Učinite Big Data upite učinkovitima u MongoDB-u
Vaš upit mora biti što učinkovitiji ako želite izvoditi dubinske izračune na složenim podacima u MongoDB-u. Cjevovod agregacije idealan je za napredno postavljanje upita. Umjesto manipuliranja podacima u odvojenim operacijama, što često smanjuje izvedbu, agregacija vam omogućuje da ih sve spakirate unutar jednog učinkovitog cjevovoda i izvršite ih jednom.
Iako je cjevovod agregacije učinkovitiji od MapReducea, agregaciju možete učiniti bržom i učinkovitijom indeksiranjem svojih podataka. Ovo ograničava količinu podataka koje MongoDB treba skenirati tijekom svake faze agregacije.