Professional Documents
Culture Documents
Aggregation Operations in MongoDB
Aggregation Operations in MongoDB
Opercije agregacije
• MongoDB posjeduje operacije agregacije koje obrađuju podatke i
vraćaju izračunate rezultate
• Operacije agregacije grupišu vrednosti iz više dokumenata i onda
primenjuju različite operacije nad grupom dokumenata kako bi vratili
jedan rezultat
• Dobijeni rezultat je novi JSON dokument koji može imati totalno
drugačiju strukturu od ulaznih dokumenata
• MongoDB pruža tri načina za agregaciju dokumenata:
– specijalni metodi za agregiranje
– pipeline-ovanje više naredbi
– map-reduce algoritam
Specijalni metodi za agregiranje
• Operacija count
– Prebrojava i vraća broj dokumenata koji zadovoljavaju neki
uslov
– Sintaksa
db.collection.count(query, options)
- parametar query definiše uslov koji dokumenti treba da zadovolje
- parametar options definiše dodatna ograničenja i nije obavezan
– operacija count() je identična sa
db.collection.find(query).count()
Specijalni metodi za agregiranje
• Operacija distinct
– Pronalzi različite vrednosti za zadato polje i vraća rezultat kao
niz vrednosti
– Sintaksa
db.collection.distinct(field, query, options)
- parametar field definiše polje za koje se traže različite vrednosti
- query definiše skup dokumenata nad kojim se opercija izvodi
- options definiše dodanta ograničenja koja se odnose na tražene
dokumente
Pipeline-ovanje
{
"_id": "10280",
"city": "NEW YORK",
"state": "NY",
"pop": 5574,
"loc": [-74.016323, 40.710537]
}
Pipeline-ovanje
db.zipcodes.aggregate( [
{ $group:{ _id: "$state", totalPop: { $sum: "$pop" } } },
{ $match:{ totalPop: { $gte: 10000000 } } }
])
SELECT state, SUM(pop) AS totalPop
FROM zipcodes
GROUP BY state
HAVING totalPop >= 10000000
Pipeline-ovanje
db.zipcodes.aggregate( [
{ $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } },
{ $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } }
])
Map-Reduce algoritam
• Map – reduce algoritam je način kako da se organizuje obrada
podataka na klasteru a da se pri tome smanji komunikacija
između čvorova u klasteru
• Ideja je potekla od Google i najčešće korišćena implementacija
ovog algoritma je deo Hadoop sistema, mada i neke druge nosql
baze imaju svoju implementaciju
• Ime map-reduce potiče iz funkcionalnih jezika koji imaju map-
reduce operacije nad kolekcijama
• Map reduce algoritmi se mogu pisati u bilo kom programskom
jeziku, međutim postoje i alati koji pojednostavljuju pisanje map i
reduce funkcija kao što je Apache Pig ili Apache Hive
Osnovna ideja
• Map korak
Osnovna ideja
• Reduce korak
Optimizacija Map-Reduce algoritma
• Tehnika particionisanja
– ideja je da se rezultati map funkcije grupišu na jednom čvoru i
da se pošalju reduce funkciji.
– tačnije pošto reduce funkcija radi samo sa jednim ključem, tu
grupu će paralelno obrađivati više reduce funkcija čiji će se
rezultati na kraju skupiti
Optimizacija Map-Reduce algoritma
Optimizacija Map-Reduce algoritma
• Tehnika kombinovanja
– cilj je da se smanji količina podataka koja se šalje sa čvora na
čvor izmeđi koraka map i reduce
– s obzirom da se na jednom čvoru može naći više ključ-vrednost
objekata koji imaju isti ključ, ideja je da se ti objekti prvo
kombinuju u jedan objekat pa tek onda pošalju u reduce korak.
– ova funkcija se naziva combine i usuštini je ona isto što i
reduce funkcija pa se ponekad može koristiti i prilagođena
reduce funkcija za ove potrebe
Optimizacija Map-Reduce algoritma
Kombinovanje više Map-Reduce algoritama u jedan
• Prednosti
– lakše je pisati funkcije koje rade jednostavnije zadatke
– međurezultati ponekad mogu takođe biti od kuristi pa se mogu
sačuvati u posebne agregate (materialized views)
Inkrementalni Map-Reduce algoritam
• Ponekad izvršavanje map i reduce funkcije može dugo da traje čak i na klasteru, a
novi podaci mogu non-stop da pristižu i tada se algoritam mora puštati iz početka,
što i nije efikasno
• Bolje rešenje da se vrši inkrementalno ažuriranje dobijenih rezultata
– map funkcije se mogu puštati inkrementalno jer su nezavisne
– reduce funkcije je malo teže implementirati inkrementalno jer promene u
rezultatima map funkcije utiču na reduce funkciju
• Koliko teško će biti implementirati inkrementalnu reduce funkciju zavisi i da li smo
nekako optimizovali map-reduce algoritam
– ako smo koristili tehniku particionisanja, onda one particije koje se nisu menjale
ne moraju ponovo u reduce korak,
– ako smo koristili combine funkciju nju ne moramo ponavljati ako se nisu
promenili ulazi
Map-Reduce i Mongo
mapReduce komanda
function(key, value){
//agregira nešto
return result;
}
Sintaksa mapReduce komande
{
"cust_id" : "abc123",
"ord_date" : new Date("Oct 04, 2012"),
"status" : "A",
"items" : [{"sku" : "mmm","qty" : 5,"price" : 3},
{"sku" : "nnn", "qty" : 5, "price" : 2.5}]
}
Primer 2
• Finalize funkcija
db.posts.mapReduce(
mapFunction,
reduceFunction,
{
out: "map_reduce_example",
query: { ord_date:{ $gt: new Date('01/01/2012')}},
finalize: finalizeFunction
}
)