Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
- SEMINARUL 2 -
Aggregation framework
Aggregation framework definește un proces care manipulează documentele în diferite etape
(stages), le prelucrează în conformitate cu criteriile furnizate și apoi returnează rezultatele.
Procesul de prelucrare al MongoDB este modelat sub forma unui flux de tip pipeline
implementat prin metoda aggregate() în care o listă de operatori / condiții sunt aplicate datelor.
[Link]( [ { <stage1> }, { <stage2> },... ] )
• procesul de agregare se poate constitui din mai multe etape, denumite stages;
• procesul începe cu introducerea tuturor documentelor din cadrul colecției în prima etapă;
• documentele obținute în fiecare etapă devin input pentru etapa următoare;
• fiecare etapă transformă documentele pe măsură ce trec prin fluxul de prelucrare;
• etapele nu trebuie să producă un document de ieșire pentru fiecare document de intrare; de
exemplu, unele etape pot genera documente noi (de exemplu: $group), iar altele pot filtra
documente inițiale (de exemplu: $match).
• o etapă poate apărea de mai multe ori în flux, aceasta fiind repetată pentru a filtra documentele în
continuare.
Manualul de referință MongoDB prezintă detaliat etapele care pot apărea într-un flux de
agregare: [Link]
pipeline-operator-reference
Un flux de prelucrare a datelor poate fi reprezentat astfel:.
-1-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
Principalele etape ale fluxului de prelucrare
Etapele fluxului de prelucrare se specifică utilizându-se sintaxa:
{ $<stage> : { } }
Expresii de agregare: referințe la numele câmpurilor din documentele de intrare în diferite etape. Se
indică prin "$denumireCamp", denumirea câmpului fiind delimitată prin includere între " "
Exemple de utilizare:
{$match: {salariul: {$gt: 2500}}}
{$group: {_id: "$salariul"}}
{$sort: {nume: -1}}
$match
• utilizează interogările MongoDB standard în scopul filtrării documentelor
• nu efectuează modificări asupra structurii documentelor care vor fi returnate
• numai acele documente care îndeplinesc condițiile indicate explicit vor trece către următoarea
etapă din flux
• se recomandă ca etapa $match să fie utilizată cât mai devreme în fluxul de prelucrare, astfel
încât să se limiteze numărul documentelor care vor fi transmise următoarelor etape
• sintaxa generală este:
{$match: { <conditii>}}}
Ex. 1. Se returnează documentele care îndeplinesc condițiile de filtrare asupra câmpurilor salariul și
departament:
-2-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
$addFields
• adaugă câmpuri noi documentelor
• se utilizează în vederea determinării unor valori calculate
• produce modificări asupra structurii documentelor care vor fi returnate
Ex. 2. Se returnează toate documentele colecției, adăugându-se fiecăruia un nou câmp calculat pe
baza celor existente
$group
• permite gruparea datelor în funcție de anumite criterii
• fiecare grup distinct format va fi transmis către următoarea etapă sub forma unui document cu
un identificator unic (_id)
• sintaxa generală este:
{$group: {_id:<expresie>, <câmp>: {<[Link]>: <expresie>}}}
• operatorii de grupare sunt: $sum, $avg, $max, $min, $push
Exemple de utilizare:
{$group: {_id: "$departament"}}
{$group: {_id: {departament: "$departament",
functie: "$functie"}}
Ex. 3. Se efectuează o grupare a documentelor inițiale în funcție de valoarea câmpului departament
și se returnează documente noi, corespunzătoare fiecărui grup
-3-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
Ex. 4. Se efectuează o grupare a documentelor inițiale în funcție de departament și oraș și se
returnează documente noi, corespunzătoare fiecărui grup
Ex. 5. Se construiește un flux de prelucrări prin care:
− $match: se efectuează o filtrare a datelor în funcție de oraș
− $group: se efectuează o grupare a documentelor obținute din etapa anterioară în funcție de
departament și oraș și se returnează documente noi, corespunzătoare fiecărui grup
-4-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
Ex. 6. Se construiește un flux de prelucrări prin care:
− $group: se efectuează o grupare a tuturor documentelor colecției în funcție de departament și
oraș și se returnează documente noi, corespunzătoare fiecărui grup
− $match: se efectuează o filtrare a documentelor obținute din etapa anterioară în funcție de oraș
-5-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
$project
• documentelor intrate în această etapă le este modificată structura, în funcție de proiecția dorită
• sintaxa generală este:
{$project: {<camp>: <1|0>, <campNou>: <expresie>}}
• un câmp descris cu valoarea 1 sau true va apărea în documentele rezultate
• omiterea _id din lista specificațiilor va conduce la afișarea implicită a acestuia
• excluderea _id din documentele rezultate se va exprima prin valoare 0 sau false
• pot fi adăugate câmpuri noi sau pot fi redenumite unele existente prin indicarea unor valori
sau a unor expresii
Ex. 7. Se construiește un flux de prelucrări prin care:
− $match: se efectuează o filtrare a datelor în funcție de nume
− $project: se efectuează o proiecție asupra documentelor obținute din etapa anterioară și se
returnează documente noi, având ca și câmpuri numai nume și prenume
Ex. 8. Se construiește un flux de prelucrări prin care:
− $match: se efectuează o filtrare a datelor în funcție de salariu
− $project: se efectuează o proiecție asupra documentelor obținute din etapa anterioară și se
returnează documente noi, având ca și câmpuri nume, prenume și infoDepartament (construit în
urma unei restructurări a informațiilor din câmpurile existente)
-6-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
$sort
• aranjează documentele returnate în funcție de sensul indicat prin cheia de sortare
• etapa nu produce modificări în documente, ci doar le schimbă ordinea de returnare
• în cazul în care cheia de sortare are valoarea 1, ordonarea se va efectua ascendent
• în cazul în care cheia de sortare are valoarea -1, ordonarea se va efectua descendent
• sintaxa generală este:
{$sort: {<camp>: <-1|1>,...}}
Ex. 9. Se construiește un flux de prelucrări prin care:
− $match: se efectuează o filtrare a datelor în funcție de salariu
− $sort: se efectuează o sortare asupra documentelor obținute din etapa anterioară și se returnează
documente noi, având efectuată sortare după nume
-7-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
$count
• întoarce numărul de documente obținute din etapa anterioară
• se numără printre ultimele etape din flux
• sintaxa generală este:
{$count: "<denumire>"}
Ex. 10. Se construiește un flux de prelucrări prin care:
− $match: se efectuează o filtrare a datelor în funcție de oras
− $count: se efectuează o agregare și se returnează un document nou care conține un singur câmp,
calculat prin numărarea documentelor obținute din etapa anterioară
-8-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
Ex. 11. Se construiește un flux de prelucrări prin care:
− $group: se efectuează o grupare a tuturor documentelor colecției în funcție de departament și
oraș și se returnează documente noi, corespunzătoare fiecărui grup
− $count: se efectuează o agregare și se returnează un document nou care conține un singur câmp,
calculat prin numărarea documentelor obținute din etapa anterioară
Ex. 12. Se construiește un flux de prelucrări prin care:
− $match: se efectuează o filtrare a datelor în funcție de salariul
− $group: se efectuează o grupare a tuturor documentelor colecției în funcție de departament și se
returnează documente noi, corespunzătoare fiecărui grup
− $count: se efectuează o agregare și se returnează un document nou care conține un singur câmp,
calculat prin numărarea documentelor obținute din etapa anterioară
$unwind
• utilizarea de câmpuri cu valori dintr-un vector poate conduce la necesitatea prelucrărilor
individuale ale acestora, ca elemente componente
• fiecare document de ieșire are aceeași structură ca și cel de intrare, dar valoarea vectorului
este înlocuită prin elementele componente
-9-
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
• sintaxa generală este:
{$unwind: < denumireCampVector >}
Ex. 13. Se construiește un flux de prelucrări prin care:
− $unwind: se construiesc documente noi, prin descompunerea vectorului care conține
competențele
− $project: se solicită afișarea doar pentru anumite câmpuri din documentele obținute în etapa
anterioară
Ex. 14. Se construiește un flux de prelucrări prin care:
− $unwind: se construiesc documente noi, prin descompunerea vectorului care conține
competențele
− $group: se efectuează o grupare a documentelor obținute din etapa anterioară, în funcție de
competente și se returnează documente noi, corespunzătoare fiecărui grup
- 10 -
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
$out
• salvează documentele rezultate în urma procesului de prelucrare într-o colecție nouă
• atunci când se utilizează este întotdeauna ultima etapă din flux
Ex. 15. Se construiește un flux de prelucrări prin care:
− $group: se efectuează o grupare a tuturor documentelor colecției în funcție de departament, se
calculează salariul mediu și se returnează documente noi, corespunzătoare fiecărui grup
− $out: se salvează într-o colecție nouă documentele obținute din etapa anterioară
- 11 -
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
Operatorii de grupare (accumulator operators)
Operatorii de grupare se specifică utilizându-se sintaxa:
{$operatorGrupare: <expresie>}
Exemple de utilizare:
{total: {$sum: "$salariul"}}
{numar: {$sum: 1}}
$sum
• returnează suma valorilor numerice, ignorându-le pe cele nenumerice
• cel mai des este utilizată în etapa $group, dar poate fi folosită și în etapa $project
• utilizată în etapa $group, va returna suma tuturor valorilor numerice asociate unei chei
indicate la nivelul fiecărui grup
• utilizată în etapa $project, va produce un nou câmp cu valoarea obținută ca sumă a valorilor
expresiilor indicate
• sintaxa generală este:
{$sum: <expresie> }
Ex. 16. Se efectuează o grupare a tuturor documentelor colecției în funcție de departament, se
calculează numărul de angajați (contorizând fiecare document) și se returnează documente noi,
corespunzătoare fiecărui grup
$avg
• returnează media valorilor numerice, ignorându-le pe cele nenumerice
• cel mai des este utilizată în etapa $group
- 12 -
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
• utilizată în etapa $group, va returna media tuturor valorilor numerice asociate unei chei
indicate la nivelul fiecărui grup
• sintaxa generală este:
{$avg: < expresie > }
$max and $min
• returnează valorile maximă, respectiv minimă, dintr-un vector
• returnează 0 pentru câmpuri care nu există
• cel mai des sunt utilizate în etapa $group
• utilizate în etapa $group, vor returna maximul, respectiv minimul tuturor valorilor numerice
asociate unei chei indicate la nivelul fiecărui grup
• sintaxa generală este:
{$max: < expresie > } / {$min: < expresie > }
Ex. 17. Se efectuează o grupare a tuturor documentelor colecției în funcție de departament, se
calculează salariile total, mediu, minim și maxim și se returnează documente noi, corespunzătoare
fiecărui grup
$push
• returnează un vector conținând valori ale expresiei indicate
• poate apărea doar în etapa $group
• sintaxa generală este:
{$push: < expresie > }
- 13 -
Programul de masterat: BAZE DE DATE – SUPORT PENTRU AFACERI
Disciplina: Baze de date NoSQL
________________________________________________________________________________________________
Ex. 18. Se efectuează o grupare a tuturor documentelor colecției în funcție de departament, indicând
pentru fiecare grup și lista numelor angajaților (sub formă de vector)
Comparație a termenilor SQL-MongoDB
SQL MongoDB
SELECT $project
WHERE/HAVING $match
JOIN $lookup
LIMIT $limit
GROUP BY $group
ORDER BY $sort
COUNT() $sum
SUM() $sum
AVG() $avg
- 14 -