Back to Basics-Webinar 5: Einführung in das Aggregation-Framework

34
MongoDB Europe 2016 Old Billingsgate, London 15. November mongodb.com/europe Mit Code benjaminlorenz20 sind Ihre Tickets 20 % günstiger!

Transcript of Back to Basics-Webinar 5: Einführung in das Aggregation-Framework

MongoDB Europe 2016Old Billingsgate, London

15. November

mongodb.com/europe

Mit Code benjaminlorenz20 sind Ihre Tickets 20 % günstiger!

Back to Basics 2016: Webinar 5

Einführung in das Aggregation Framework

Benjamin LorenzSenior Solutions Architect, MongoDB Frankfurt

@benjaminlorenz

V1.0

3

Rückblick

• Webinar 1: Einführung in NoSQL– Verschiedene Typen von NoSQL-Datenbanken– MongoDB ist eine Dokumentdatenbank

• Webinar 2: Ihre erste MongoDB-Anwendung– Erstellen von Datenbanken und Collections– Grundlegende Operationen, Indizes und explain()

• Webinar 3: Schema-Design– Dynamische Schemata– Einbettung von Dokumenten

• Webinar 4: Text- und Geoindizes

4

Das Aggregation Framework

• Eine Analyse-Engine für MongoDB• Um welche Arten von Analysen geht es?• Zwei verschiedene Arten von Datenbankanwendungen:• OLTP: Online Transaction Processing

– Flugreservierungen– Geldautomaten– Taxibuchungen

• OLAP: Online Analytical Processing– Mit welchen Flugtickets verdienen wir am meisten?– Wann müssen wir unsere Geldautomaten neu bestücken?– Wie viele Taxis brauchen wir in Berlin Mitte?

5

Was geschieht in der Datenbank?

OLTP OLAP

6

OLAP: Vorsicht, (Hadoop-)Falle!

• OLAP-Abfragen erfordern häufig Tabellen-Scans.• Abfrageergebnisse werden oft für zukünftige Analysen und Vergleiche

gespeichert.• Viele Kunden denken bei OLAP automatisch an Spark oder Hadoop, aber:

– Deren Implementierung ist extrem komplex.– Sie sind für Analyse-Algorithmen konzipiert. (Man muss also ein

Programm schreiben.)– Gründliche Kenntnisse paralleler Algorithmen und der Parallelverarbeitung

sind erforderlich.• Das Aggregation Framework ist deutlich anwenderfreundlicher.• In den meisten Fällen kommen Sie damit schneller und einfacher zum Ziel.

7

Das Aggregation Framework: Eine Pipeline für die Datenverarbeitung

Auswählen Umstellen Gruppieren SortierenReduzieren

• Vergleichbar mit der Unix-Pipeline |.• Die Ausgabe einer Stufe liefert die Eingabe für die nächste Stufe.• In jeder Stufe wird eine Aufgabe erledigt.• Stufen können mehrfach durchlaufen werden.• Als Eingabe wird eine Collection erwartet.

8

Pipeline-Operatoren• $match

Auswahl einer Teilmenge der Collection

• $projectStellt Dokumente um

• $groupAggregiert Daten aus den Dokumenten

• $outErstellt eine neue Collection für den Output

• $sortSortiert Dokumente

• $limit/$skipBegrenzen die Anzahl der Dokumente

• $lookupVerbindet zwei Collections (Left Outer Join)

• $unwindVerwandelt eingebettete Arrays in Dokumente

9

MOT-Beispieldatensatz

10

Ein Beispieldokument{ "_id" : ObjectId("5759ee6e8684975e1098af68"),

"TestID" : 400,"VehicleID" : "278","TestDate" : ISODate("2013-04-23T00:00:00Z"),"TestClassID" : "4","TestType" : "N","TestResult" : "P","TestMileage" : 99284,"Postcode" : "E","Make" : "AUDI","Model" : "A3","Colour" : "BLACK","FuelType" : "P","CylinderCapacity" : 1598,"FirstUseDate" : ISODate("2003-11-11T00:00:00Z“) }

11

Datenanalyse mit der MongoDB-Shell

MongoDB Enterprise > use vosaswitched to db vosaMongoDB Enterprise > db.results2013.findOne(){

"_id" : ObjectId("577294020cb23533dfbaac18"),"TestID" : 17,"VehicleID" : 28,"TestDate" : ISODate("2013-05-02T00:00:00Z"),"TestClassID" : "2","TestType" : "N","TestResult" : "P","TestMileage" : 46414,"Postcode" : "BN","Make" : "SUZUKI","Model" : "UNCLASSIFIED","Colour" : "GREEN","FuelType" : "P","CylinderCapacity" : 398,"FirstUseDate" : ISODate("1993-08-11T00:00:00Z")

}

12

$limit

MongoDB Enterprise > db.results2013.aggregate([ { "$limit" :2 } ] ){

"_id" : ObjectId("577294020cb23533dfbaac18"),"TestID" : 17,"VehicleID" : 28,"TestDate" : ISODate("2013-05-02T00:00:00Z"),"TestClassID" : "2","TestType" : "N","TestResult" : "P","TestMileage" : 46414,"Postcode" : "BN","Make" : "SUZUKI","Model" : "UNCLASSIFIED",

13

Erstellen einer kleineren Collection

> db.results2013.aggregate( [ { "$limit" : 10000 }, {"$out" : "results10k" } ] )> db.results10k.count()10000> db.results10k.findOne(){

"_id" : ObjectId("577294020cb23533dfbaac18"),"TestID" : 17,"VehicleID" : 28,"TestDate" : ISODate("2013-05-02T00:00:00Z"),"TestClassID" : "2","TestType" : "N","TestResult" : "P","TestMileage" : 46414,"Postcode" : "BN","Make" : "SUZUKI","Model" : "UNCLASSIFIED","Colour" : "GREEN","FuelType" : "P","CylinderCapacity" : 398,"FirstUseDate" : ISODate("1993-08-11T00:00:00Z")

}

14

$match

…aggregate([ { "$limit" :2000 }, { "$match" : { "FirstUseDate" : { "$ne" : "NULL" }}} ])

{ "_id" : ObjectId("577294020cb23533dfbaac18"), "TestID" : 17, "VehicleID" : 28, "TestDate" : ISODate("2013-05-02T00:00:00Z"), "TestClassID" : "2", "TestType" : "N", "TestResult" : "P", "TestMileage" : 46414, "Postcode" : "BN", "Make" : "SUZUKI", "Model" : "UNCLASSIFIED", "Colour" : "GREEN", "FuelType" : "P", "CylinderCapacity" : 398, "FirstUseDate" : ISODate("1993-08-11T00:00:00Z") }{ "_id" : ObjectId("577294020cb23533dfbaac19"), "TestID" : 22, "VehicleID" : 33, "TestDate" : ISODate("2013-06-07T00:00:00Z"), "TestClassID" : "2", "TestType" : "N", "TestResult" : "P", "TestMileage" : 15605, "Postcode" : "PE", "Make" : "UNCLASSIFIED", "Model" : "UNCLASSIFIED", "Colour" : "BLACK", "FuelType" : "P", "CylinderCapacity" : 150, "FirstUseDate" : ISODate("1962-01-01T00:00:00Z") }{ "_id" : ObjectId("577294020cb23533dfbaac1a"), "TestID" : 44, "VehicleID" : 49, "TestDate" : ISODate("2013-08-09T00:00:00Z"), "TestClassID" : "4", "TestType" : "N", "TestResult" : "PRS", "TestMileage" : 72694, "Postcode" : "SO", "Make" : "UNCLASSIFIED", "Model" : "UNCLASSIFIED", "Colour" : "BLACK", "FuelType" : "P", "CylinderCapacity" : 998, "FirstUseDate" : ISODate("2001-05-16T00:00:00Z") }...

15

$project (1 von 2)

ageinusecs = { "$subtract" : [ "$TestDate", "$FirstUseDate" ] }ageinyears = { "$divide" :[ ageinusecs , (1000*3600*24*365) ] }floorage = { "$floor" : ageinyears }ispass = { "$cond" : [{"$eq": ["$TestResult","P"]},1,0]}

project = { "$project" : { "Make” :1, "Model” :1, "VehicleID" :1, "TestResult” :1, "Age” :floorage, "pass” :ispass }}

16

$project (2 von 2)

MongoDB Enterprise > db.nonulldates.aggregate( [ project ] )

{ "_id" : ObjectId("577294020cb23533dfbaac18"), "VehicleID" : 28, "TestResult" : "P", "Make" : "SUZUKI", "Model" : "UNCLASSIFIED", "Age" : 19, "pass" : 1 }

{ "_id" : ObjectId("577294020cb23533dfbaac19"), "VehicleID" : 33, "TestResult" : "P", "Make" : "UNCLASSIFIED", "Model" : "UNCLASSIFIED", "Age" : 51, "pass" : 1 }

{ "_id" : ObjectId("577294020cb23533dfbaac1a"), "VehicleID" : 49, "TestResult" : "PRS", "Make" : "UNCLASSIFIED", "Model" : "UNCLASSIFIED", "Age" : 12, "pass" : 0 }{ "_id" : ObjectId("577294020cb23533dfbaac1b"), "VehicleID" : 54, "TestResult" : "P", "Make" : "NISSAN", "Model" : "MICRA GX", "Age" : 13, "pass" : 1 }{ "_id" : ObjectId("577294020cb23533dfbaac1c"), "VehicleID" : 54, "TestResult" : "F", "Make" : "UNCLASSIFIED", "Model" : "UNCLASSIFIED", "Age" : 13, "pass" : 0 }{ "_id" : ObjectId("577294020cb23533dfbaac1d"), "VehicleID" : 63, "TestResult" : "P", "Make" : "UNCLASSIFIED", "Model" : "UNCLASSIFIED", "Age" : 12, "pass" : 1 }{ "_id" : ObjectId("577294020cb23533dfbaac1e"), "VehicleID" : 63, "TestResult" : "F", "Make" : "UNCLASSIFIED", "Model" : "UNCLASSIFIED", "Age" : 12, "pass" : 0 }{ "_id" : ObjectId("577294020cb23533dfbaac1f"), "VehicleID" : 93, "TestResult" : "P", "Make" : "BMW", "Model" : "318ti SE COMPACT", "Age" : 12, "pass" : 1 }…

17

$group

countMakes = { "$group" : { "_id" : "$Make", "total" : { "$sum" : 1 }}}db.nonulldates.aggregate( [ countMakes ]){ "_id" : "IVECO", "total" : 1 }{ "_id" : "ISUZU", "total" : 1 }{ "_id" : "YAMAHA", "total" : 1 }{ "_id" : "OLDSMOBILE", "total" : 1 }{ "_id" : "KAWASAKI", "total" : 1 }{ "_id" : "MASERATI", "total" : 1 }{ "_id" : "BENELLI", "total" : 1 }{ "_id" : "BENTLEY", "total" : 3 }{ "_id" : "AUDI", "total" : 26 }{ "_id" : "SMART", "total" : 2 }{ "_id" : "HARLEY-DAVIDSON", "total" : 1 }…

18

Das Aggregation Framework im Überblick

• Pipeline von Datenbankoperatoren• Teilmenge einer Collection auswählen, die darin enthaltenen

Dokumente umformen, aggregieren und sortieren• Zahlreiche Aggregationsfunktionen, siehe Dokumentation für $group• $lookup für Left Outer Join• $graphLookup (MongoDB 3.4) für rekursive Abfragen in Netzwerken• Leistungsstarkes Tool für die Datenverarbeitung und -analyse• Berücksichtigt und nutzt Sharding für optimale Leistung in großen

Clustern

19

Frage- und Antwortrunde

21

• Platzhaltertext

25

26

LOREM IPSUM

LOREM IPSUM

LOREM IPSUM

LOREM IPSUM

Sollicitudin VenenatisLOREM IPSUM

LOREM IPSUM

LOREM IPSUM

LOREM IPSUM

Grafische Elemente (Beispiele)

Porta Ultricies

Commodo Porta

Diagramme (Beispiele)

{ _id : ObjectId("4c4ba5e5e8aabf3"), employee_name: "Dunham, Justin", department : "Marketing", title : "Product Manager, Web", report_up: "Neray, Graham", pay_band: “C", benefits : [ { type :  "Health", plan : "PPO Plus" }, { type :   "Dental", plan : "Standard" }

] }

Code/Hervorhebung (Beispiele)

Aggregation Framework Flexibilität Backup Big Data Aktenkoffer

Gebäude Business Intelligence Kamera Kasse Katalog

Chat Häkchen Häkchen Cloud Geschäftsvertrag

Computer Inhalt Kont. Entwicklung Kreditkarte Kundenerfolg

Rechenzentrum Datenvielfalt Datengeschwindigkeit Datenvolumen Data Warehouse Datenbank

Dialog Ordner Dokumente Downloads Treiber Dynamisches Schema

EDW-Integration Schnellere Marktreife Dateitransfer Flexibel Zahnrad Hadoop

Zustandsprüfung Hochverfügbarkeit Horizontale Skalierung Integration in eine Infrastruktur

Internet der Dinge Schrittweise Entwicklung

Rettungsring Diagramm Schloss Logdatei Niedrigere Kosten Lupe

Mann Handy Messgerät Überwachung Musik Neue Aps

Neue Datentypen Online Open Source Fallschirm Personalisierung Markiernadel

Plattform-Zertifizierung Produktkatalog Puzzleteile RDBMS Echtzeit-Analysen Anspruchsvolle Fragen

Rettungsring RSS Skalierbarkeit Waage Sekundärindex Lenkrad

Stopuhr Textsuche Tick-Daten Schulung Funkturm Trophäe

Frau Welt