Az összesítési műveletek adatrekordokat dolgoznak fel és kiszámított eredményeket adnak vissza. Az aggregációs műveletek több dokumentumból származó értékeket csoportosítanak, és a csoportosított adatokon különböző műveleteket végezhetnek, hogy egyetlen eredményt adjanak vissza. Az SQL-ben a count(*) és a group by a MongoDB aggregáció megfelelője.
Az aggregate() módszer
A MongoDB-ben az aggregációhoz az aggregate() módszert kell használni.
Szintaxis
Az aggregate() metódus alapvető szintaxisa a következő –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Példa
A gyűjteményben a következő adatok vannak –
{ _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},
A fenti gyűjteményből, ha egy olyan listát szeretnénk megjeleníteni, amelyből kiderül, hogy az egyes felhasználók hány oktatóprogramot írtak, akkor a következő aggregate() metódust használjuk –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
A fenti felhasználási esetnek megfelelő SQL lekérdezés a következő lesz: select by_user, count(*) from mycol group by_user.
A fenti példában a dokumentumokat a by_user mező szerint csoportosítottuk, és a by user minden egyes előfordulása esetén az összeg előző értéke növekszik. Az alábbiakban a rendelkezésre álló aggregációs kifejezések listája következik.
Kifejezés | leírás | példa |
---|---|---|
$sum | A gyűjtemény összes dokumentumának meghatározott értékét összegzi. | db.mycol.aggregate() |
$avg | Kiszámítja a megadott értékek átlagát a gyűjtemény összes dokumentumából. | db.mycol.aggregate() |
$min | A gyűjtemény összes dokumentumából a megfelelő értékek minimumát kapja. | db.mycol.aggregate() |
$max | A megfelelő értékek maximumát kapja a gyűjtemény összes dokumentumából. | db.mycol.aggregate() |
$push | Elhelyezi az értéket egy tömbbe a kapott dokumentumban. | db.mycol.aggregate() |
$addToSet | Elhelyezi az értéket egy tömbbe a kapott dokumentumban, de nem hoz létre duplikátumokat. | db.mycol.aggregate() |
$first | A forrásdokumentumok közül a csoportosításnak megfelelően az első dokumentumot szerzi be. Ennek általában csak valamilyen korábban alkalmazott “$sort”-lépcsővel együtt van értelme. | db.mycol.aggregate() |
$last | A forrásdokumentumok közül a csoportosítás szerint az utolsó dokumentumot szerzi meg. Ennek jellemzően csak valamilyen korábban alkalmazott “$sort”-lépcsővel együtt van értelme. | db.mycol.aggregate() |
Pipeline fogalma
A UNIX parancsban a shell pipeline azt a lehetőséget jelenti, hogy egy műveletet valamilyen bemeneten végrehajtunk, és a kimenetet a következő parancs bemeneteként használjuk, és így tovább. A MongoDB ugyanezt a koncepciót támogatja az aggregációs keretrendszerben is. Lehetséges szakaszok halmaza van, és ezek mindegyikét dokumentumhalmazként veszi bemenetként, és egy eredményül szolgáló dokumentumhalmazt állít elő (vagy a csővezeték végén a végső eredményül szolgáló JSON-dokumentumot). Ez viszont felhasználható a következő szakaszhoz és így tovább.
A következők a lehetséges szakaszok az aggregációs keretrendszerben –
-
$project – Néhány konkrét mező kiválasztására szolgál egy gyűjteményből.
-
$match – Ez egy szűrési művelet, és így csökkentheti a következő szakasz bemeneteként adott dokumentumok mennyiségét.
-
$group – Ez végzi a tényleges aggregációt a fent tárgyaltak szerint.
-
$sort – Rendezi a dokumentumokat.
-
$skip – Ezzel egy adott mennyiségű dokumentum esetén előre lehet ugrani a dokumentumok listájában.
-
$limit – Ezzel az aktuális pozíciókból kiindulva a megadott számmal korlátozza a megtekintendő dokumentumok mennyiségét.
-
$unwind – Ezzel a tömböket használó dokumentumokat lehet kitekerni. Tömb használata esetén az adatok egyfajta előre összekapcsolódnak, és ezt a műveletet ezzel visszacsináljuk, hogy ismét egyedi dokumentumok legyenek. Így ezzel a fázissal növeljük a dokumentumok mennyiségét a következő fázishoz.