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.

instagram viewer

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.