Back to Basics-Webinar 5: Einführung in das Aggregation-Framework
-
Upload
mongodb -
Category
Data & Analytics
-
view
274 -
download
1
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?
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
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
LOREM IPSUM
LOREM IPSUM
LOREM IPSUM
LOREM IPSUM
Sollicitudin VenenatisLOREM IPSUM
LOREM IPSUM
LOREM IPSUM
LOREM IPSUM
Grafische Elemente (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