Agregační operace zpracovávají datové záznamy a vracejí vypočtené výsledky. Agregační operace seskupují hodnoty z více dokumentů dohromady a mohou nad seskupenými daty provádět různé operace a vracet jeden výsledek. V SQL count(*) a s group by je ekvivalentem agregace v MongoDB.
Metoda aggregate()
Pro agregaci v MongoDB byste měli použít metodu aggregate().
Syntaxe
Základní syntaxe metody aggregate() je následující –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Příklad
V kolekci máte následující data –
{ _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},
Nyní z uvedené kolekce, chcete zobrazit seznam s uvedením, kolik návodů napsal každý uživatel, pak použijete následující metodu aggregate() –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
Evivalentní dotaz pro výše uvedený případ použití bude select by_user, count(*) from mycol group by_user.
V uvedeném příkladu jsme seskupili dokumenty podle pole by_user a při každém výskytu by_user se zvýší předchozí hodnota součtu. Následuje seznam dostupných agregačních výrazů.
Výraz | Popis | Příklad |
---|---|---|
$sum | Sčítá definovanou hodnotu ze všech dokumentů v kolekci. | db.mycol.aggregate() |
$avg | Vypočítá průměr všech zadaných hodnot ze všech dokumentů v kolekci. | db.mycol.aggregate() |
$min | Zjistí minimum příslušných hodnot ze všech dokumentů v kolekci. | db.mycol.aggregate() |
$max | Získá maximum odpovídajících hodnot ze všech dokumentů v kolekci. | db.mycol.aggregate() |
$push | Vloží hodnotu do pole ve výsledném dokumentu. | db.mycol.aggregate() |
$addToSet | Vloží hodnotu do pole ve výsledném dokumentu, ale nevytvoří duplicity. | db.mycol.aggregate() |
$first | Získá první dokument ze zdrojových dokumentů podle seskupení. Obvykle to má smysl pouze spolu s nějakým dříve použitým „$sort“-stupněm. | db.mycol.aggregate() |
$last | Získá poslední dokument ze zdrojových dokumentů podle seskupení. Obvykle to má smysl jen spolu s nějakým dříve použitým „$sort“-stupněm. | db.mycol.aggregate() |
Pipeline Koncept
V příkazech UNIXu znamená shell pipeline možnost provést operaci na nějakém vstupu a výstup použít jako vstup pro další příkaz atd. Stejný koncept podporuje i MongoDB v rámci agregace. Existuje množina možných fází a každá z nich je brána jako množina dokumentů na vstupu a vytváří výslednou množinu dokumentů (nebo konečný výsledný dokument JSON na konci pipeline). Ten pak může být zase použit pro další etapu a tak dále.
Následující jsou možné etapy v agregačním rámci –
-
$projekt – Slouží k výběru některých konkrétních polí z kolekce.
-
$match – Jedná se o filtrační operaci, a proto může snížit množství dokumentů, které jsou zadány jako vstup do další fáze.
-
$group – Provádí vlastní agregaci, jak bylo uvedeno výše.
-
$sort – Třídí dokumenty.
-
$skip – Pomocí této funkce je možné přeskočit v seznamu dokumentů dopředu pro dané množství dokumentů.
-
$limit – Omezí množství prohlížených dokumentů o daný počet počínaje aktuálními pozicemi.
-
$unwind – Slouží k rozbalení dokumentů, které používají pole. Při použití pole jsou data jakoby předem spojena a tato operace se tímto zruší, aby byly opět k dispozici jednotlivé dokumenty. Tímto krokem tedy zvýšíme množství dokumentů pro další krok.
.