Operațiile de agregare procesează înregistrări de date și returnează rezultate calculate. Operațiile de agregare grupează valori din mai multe documente și pot efectua o varietate de operații asupra datelor grupate pentru a returna un singur rezultat. În SQL count(*) și with group by este un echivalent al agregării MongoDB.
Metoda aggregate()
Pentru agregarea în MongoDB, ar trebui să utilizați metoda aggregate().
Sintaxa
Sintaxa de bază a metodei aggregate() este următoarea –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Exemplu
În colecția în care aveți următoarele date –
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 100},{ _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},
Acum din colecția de mai sus, dacă doriți să afișați o listă care să precizeze câte tutoriale sunt scrise de fiecare utilizator, atunci veți utiliza următoarea metodă aggregate() –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
Interogarea echivalentă în SQL pentru cazul de utilizare de mai sus va fi select by_user, count(*) from mycol group by_user.
În exemplul de mai sus, am grupat documentele după câmpul by_user și, la fiecare apariție a lui by user, valoarea anterioară a sumei este incrementată. În continuare este prezentată o listă de expresii de agregare disponibile.
Expresie | Descriere | Exemplu |
---|---|---|
$sum | Sumează valoarea definită din toate documentele din colecție. | db.mycol.aggregate() |
$avg | Calculează media tuturor valorilor date din toate documentele din colecție. | db.mycol.aggregate() |
$min | Obține minimul valorilor corespunzătoare din toate documentele din colecție. | db.mycol.aggregate() |
$max | Obține maximul valorilor corespunzătoare din toate documentele din colecție. | db.mycol.aggregate() |
$push | Inscrie valoarea într-un array în documentul rezultat. | db.mycol.aggregate() |
$addToSet | Inserază valoarea într-un array în documentul rezultat, dar nu creează duplicate. | db.mycol.aggregate() |
$first | Obține primul document din documentele sursă în funcție de grupare. De obicei, acest lucru are sens doar împreună cu o etapă „$sort”-stage aplicată anterior. | db.mycol.aggregate() |
$last | Obține ultimul document din documentele sursă în funcție de grupare. De obicei, acest lucru are sens doar împreună cu unele etape „$sort”-stage aplicate anterior. | db.mycol.aggregate() |
Conceptul de pipeline
În comanda UNIX, pipeline-ul shell înseamnă posibilitatea de a executa o operație pe o anumită intrare și de a folosi ieșirea ca intrare pentru următoarea comandă și așa mai departe. MongoDB suportă, de asemenea, același concept în cadrul de agregare. Există un set de etape posibile și fiecare dintre acestea este luat ca intrare un set de documente și produce un set de documente rezultate (sau documentul JSON final rezultat la sfârșitul pipeline-ului). Acesta poate fi la rândul său utilizat pentru următoarea etapă și așa mai departe.
În continuare sunt prezentate etapele posibile în cadrul de agregare –
-
$proiect – Utilizat pentru a selecta unele câmpuri specifice dintr-o colecție.
-
$match – Aceasta este o operație de filtrare și, prin urmare, aceasta poate reduce cantitatea de documente care sunt date ca intrare în etapa următoare.
-
$group – Aceasta realizează agregarea propriu-zisă, așa cum s-a discutat mai sus.
-
$sort – Sortează documentele.
-
$skip – Cu aceasta, este posibil să se sară înainte în lista de documente pentru o anumită cantitate de documente.
-
$limit – Cu aceasta se limitează cantitatea de documente care trebuie consultate, cu numărul dat, pornind de la pozițiile curente.
-
$unwind – Cu aceasta se derulează documentele care folosesc array-uri. Atunci când se utilizează o matrice, datele sunt într-un fel de pre-unite și această operațiune va fi desfăcută cu acest lucru pentru a avea din nou documente individuale. Astfel, cu această etapă vom crește cantitatea de documente pentru următoarea etapă.
.