37
1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2( Adatbázisrendszerek 2) 10. Előadás: Aggregation framework – aggregációs keretrendszer

ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

1

Sapientia - Erdélyi Magyar TudományEgyetem (EMTE)

ABR 2( Adatbázisrendszerek 2)

10. Előadás: Aggregation framework –

aggregációs keretrendszer

Page 2: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Aggregációs keretrendszer

Name Category Manufacturer Price Ipad Tablet Apple 499 Nexus Cellphone Samsung 350

2

SELECT manufacturer,count(*) FROM product GROUP BY manufacturer

Product tábla:

Manufacturer Count Apple 2 Samsung 3

Page 3: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Aggregációs keretrendszer

Írjunk egy aggregációs lekérdezést, amelyik megtalálja kategóriánként a termékek számát egy kollekción:

{ "_id" : ObjectId("50b1aa983b3d0043b51b2c52"), "name" : "Nexus 7", "category" : "Tablets", "manufacturer" : "Google", "price" : 199 }

Az eredmény kulcsot “num_product”-nak megadva, a kategóriákra összegezve a következőképpen néz ki a lekérdezés:

db.products.aggregate([{$group:{"_id":"$category","num_products":{"$sum":1}}}])

3

Page 4: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Aggregation pipeline – aggregációs csatorna

4

$project $match

$project $group

kollekció

eredmény

[] a tömb minden eleme része a csatornának. A sorrend megegyezik a tömbben levő sorral.

Page 5: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Aggregációs műveletek

$project – reshape – 1:1 $match – filter – n:1 $group – aggregate – n:1 $sort – sort – 1:1 $skip – skips – n:1 $limit – limits – n:1 $unwind – normalize – 1:n $out – output – 1:1 $redact, $geonear

5

Page 6: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

• Quiz: The Aggregation Pipeline • Which of the following are stages in the aggregation

pipeline. Check all that apply. • Match • Transpose • Group • Skip • Limit • Sort • Project • Unwind

6

Page 7: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Egyszerű aggregáció magyarázata

7

Products $group results

upsert

_id:”Apple” num_product:3

_id:”Samsung” num_product:2

_id:”Sony” num_product:1

Page 8: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz

db.stuff.find() { "_id" : ObjectId("50b26f9d80a78af03b5163c8"), "a" : 1, "b" : 1, "c" : 1 } { "_id" : ObjectId("50b26fb480a78af03b5163c9"), "a" : 2, "b" : 2, "c" : 1 } { "_id" : ObjectId("50b26fbf80a78af03b5163ca"), "a" : 3, "b" : 3, "c" : 1 } { "_id" : ObjectId("50b26fcd80a78af03b5163cb"), "a" : 3, "b" : 3, "c" : 2 } { "_id" : ObjectId("50b26fd380a78af03b5163cc"), "a" : 3, "b" : 5, "c" : 3 }

db.stuff.aggregate([{$group:{_id:'$c'}}]) Hány dokumentum lesz az eredményben az összesítés után?

8

Page 9: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Compound grouping – multiple keys

Összetett csoportosítás: többszörös kulcsok Szeretnénk tudni, hogy melyik gyártó, mely

kategóriából hány fajtát gyárt: SELECT manufacturer, category, sum(*) FROM

products GROUP BY manufacturer,category; _id:{“manufacturer”:$manufacturer, “category”:

$category}

9

Page 10: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Összetett kulcsok –QUIZ

db.stuff.find() { "_id" : ObjectId("50b26f9d80a78af03b5163c8"), "a" : 1, "b" : 1, "c" : 1 } { "_id" : ObjectId("50b26fb480a78af03b5163c9"), "a" : 2, "b" : 2, "c" : 1 } { "_id" : ObjectId("50b26fbf80a78af03b5163ca"), "a" : 3, "b" : 3, "c" : 1 } { "_id" : ObjectId("50b26fcd80a78af03b5163cb"), "a" : 3, "b" : 3, "c" : 2 } { "_id" : ObjectId("50b26fd380a78af03b5163cc"), "a" : 3, "b" : 5, "c" : 3 } { "_id" : ObjectId("50b27f7080a78af03b5163cd"), "a" : 3, "b" : 3, "c" : 2 }

db.stuff.aggregate([{$group: {_id: {'moe':'$a', 'larry':'$b', 'curly':'$c' } } }])

Mennyi dokumentum lesz az eredményben?

10

Page 11: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Aggregációs kifejezések

$sum $avg $min $max $push $addtoSet $first $last - $sort – hoz kapcsolódhat az utolsó 2

11

Page 12: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

QUIZ – aggregációs kifejezések

• Mely aggregációs kifejezést kell használnunk a sort-al együtt, hogy értelme legyen az egésznek:

• $addToSet • $first • $last • $max • $min • $avg • $push • $sum

12

Page 13: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$sum használata – QUIZ dokuban

use agg; db.products.aggregate([ {$group: { _id: { "maker":"$manufacturer" }, sum_prices:{$sum:"$price"} } }])

use agg;db.zips.aggregate([{"$group":{"_id":"$state",

"population":{$sum:"$pop"}}}])

13

Page 14: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$avg használata – QUIZ is

use aggdb.products.aggregate([ {$group: { _id: { "category":"$category" }, avg_price:{$avg:"$price"} } }])

QUIZ – találjuk meg minden államra átlagolt populációt ZIP

kódok szerint.

14

Page 15: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$addToSet használata - QUIZ dokuban

use agg; db.products.aggregate([ {$group: { _id: { "maker":"$manufacturer" }, categories:{$addToSet:"$category"} } }])

15

Page 16: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$push használata - QUIZ - dokuban

use agg; db.products.aggregate([ {$group: { _id: { "maker":"$manufacturer" }, categories:{$push:"$category"} } }])

16

Page 17: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$max and $min használata

use agg; db.products.aggregate( [ {$group: { _id: { "maker":"$manufacturer" },

maxprice:{$max:"$price"} } }] )

17

Page 18: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz: $max and $min használata

Mégegyszer vegyük a zip code adatbázist, írjunk egy aggregációs lekérdezést, amelyik visszaadja a zip kódot és népességet minden államban, ahol a zip kódhoz a legnagyobb népesség tartozik. A kimenet valahogy ilyenformán kellene kinézzen:

{ "_id" : "WI", "pop" : 57187 }, { "_id" : "WV", "pop" : 70185 }, ..stb.

Mégegyszer, a kollekció neve zips. db.zips.aggregate([{$group:{"_id":"$state","pop":{"$max":"$p

op"}}}])

18

Page 19: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Kétszintű $group – QUIZ dokuban

use aggdb.grades.aggregate([ {'$group':{_id:{class_id:"$class_id", student_id:"$student_id"}, 'average':{"$avg":"$score"}}}])

use aggdb.grades.aggregate([

{'$group':{_id:{class_id:"$class_id", student_id:"$student_id"}, 'average':{"$avg":"$score"}}}, {'$group':{_id:"$_id.class_id", 'average':{"$avg":"$average"}}}])

19

Page 20: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$project használata – QUIZ dokuban

use agg; db.products.aggregate([ {$project: { _id:0, 'maker': {$toLower:"$manufacturer"}, 'details': {'category': "$category", 'price' : {"$multiply":["$price",10]} }, 'item':'$name' } }])

20

Page 21: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$match használata

db.zips.aggregate([ {$match: { state:"NY" } }]) db.zips.aggregate([ {$match: { state:"NY" } },

{$group: { _id: "$city", population: {$sum:"$pop"}, zip_codes: {$addToSet: "$_id"} } }])

db.zips.aggregate([ {$match: { state:"NY" } },

{$group: { _id: "$city", population: {$sum:"$pop"}, zip_codes: {$addToSet: "$_id"} } }, {$project: { _id: 0, city: "$_id", population: 1, zip_codes:1 } } ])

21

Page 22: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz: $match használata

Mégegyszer, a zipcode kollekcióra utalva, írjunk egy olyan aggregációs lekérdezést, egyetlen match fázissal, amelyik szűri azon zipkódokat, amelyekhez több, mint 100000 ember tartozik. A $gt operátort meg kell nézni a MongoDB dokumentumokban.

Feltételezzük, hogy a kollekció neve zips. db.zips.aggregate([ {$match: { pop:{$gt:100000} } } ])

22

Page 23: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$text használata

23

Page 24: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz: $text használata

Mely állítások igazak a $text operátorra nézve az aggregációs csőrendszerben?

• $text –et csak a $match fázisban lehet használni • $text – et csak olyan $match fázisban lehet

használni, amleyik az aggregációs cső legelején van • $text – et lehet használni az egész szövegre

vonatkozó keresési index nélkül is, amikor a sorbaállítási aggregáció a $text – el egyforma irányba hat.

24

Page 25: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$sort használata

use aggdb.zips.aggregate([ {$match: { state:"NY" } }, {$group: { _id: "$city", population: {$sum:"$pop"}, }

}, {$project: { _id: 0, city: "$_id", population: 1, } },

{$sort: { population:-1 } } ])

25

Page 26: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz: $sort használata

Mégegyszer használjuk a zips kollekciót: { "city" : "ACMAR", "loc" : [ -86.51557, 33.584132 ], "pop" :

6055, "state" : "AL", "_id" : "35004" } Írjunk egy aggregációs lekérdezést, amelyikben sorbaállítjuk

(state,city) szerint, mindkettő növekvő sorrendben. db.zips.aggregate([ {$sort:{state:1,city:1} } ])

26

Page 27: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$limit és $skip használata – QUIZ dokumentumban

use aggdb.zips.aggregate([ {$match: { state:"NY" } }, {$group: { _id: "$city", population: {$sum:"$pop"}, } }, {$project: { _id: 0, city: "$_id", population: 1, } }, {$sort: { population:-1 } }, {$skip: 10}, {$limit: 5}])

27

Page 28: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$first és $last használata – QUIZ dokumentumban

Dokumentumban firstAndLast

28

Page 29: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$unwind használata

use agg; db.items.drop(); db.items.insert({_id:'nail', 'attributes':['hard', 'shiny', 'pointy',

'thin']}); db.items.insert({_id:'hammer', 'attributes':['heavy', 'black',

'blunt']}); db.items.insert({_id:'screwdriver', 'attributes':['long', 'black',

'flat']}); db.items.insert({_id:'rock', 'attributes':['heavy', 'rough',

'roundish']}); db.items.aggregate([{$unwind:"$attributes"}]);

29

Page 30: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz: $unwind használata

A következő kollekciónk van: db.people.find() { "_id" : "Will", "likes" : [ "physics", "MongoDB", "indexes" ]

} { "_id" : "Dwight", "likes" : [ "starting companies", "restaurants", "MongoDB" ] }

Unwind-eljük a "likes” tömböt minden dokumentumból. Hány dokumentumunk lesz az eredményben? o 2 o 4 o 6 o 9

30

Page 31: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$unwind példa

use blog; db.posts.aggregate([ /* unwind by tags */ {"$unwind":"$tags"}, /* now group by tags, counting each tag */ {"$group": {"_id":"$tags", "count":{$sum:1} } }, /* sort by popularity */ {"$sort":{"count":-1}}, /* show me the top 10 */ {"$limit": 10}, /* change the name of _id to be tag */ {"$project": {_id:0, 'tag':'$_id', 'count' : 1 } } ])

31

Page 32: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz: $unwind example

Mely csoportosító operátor tudja megfordítani az unwind hatását? o $sum o $addToSet o $push o $first

32

Page 33: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Dupla $unwind

Dokumentumban

33

Page 34: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

$out használata

34

Page 35: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Aggregációs opciók

35

Page 36: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

Quiz: Aggregation Options

Melyik aggregációs kifejezés használja helyesen a lemezegységet aggregáció közben?

o db.zips.aggregate( [ { $group : { _id : "$state" , population :

{ $sum : "$pop" } } } ] , { $allowDiskUse : true } ) o db.zips.aggregate( [ { $group : { _id : "$state" , population :

{ $sum : "$pop" } } } ] , { allowDiskUse : true } ) o db.zips.aggregate( { $group : { _id : "$state" , population : {

$sum : "$pop" } } } , { allowDiskUse : true } ) o db.zips.aggregate( { $group : { _id : "$state" , population : {

$sum : "$pop" } } } , { $allowDiskUse : true } )

36

Page 37: ABR 2( Adatbázisrendszerek 2 10. Előadás: Aggregation ...emte.siculorum.ro/.../eloadas/MongoDB/ABR2_10k2019.pdf · 1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) ABR 2(

A továbbiakban

SQL és Aggregáció közötti megfeleltetés

Pár mindennapos SQL példa

Az Aggregációs Keretrendszer korlátai

37