Wachsende Daten beanspruchen schnellere und klügere Systeme, um die Datenverarbeitung bewältigen zu können. Die zeitgemäße Antwort darauf lautet: Big Data mit NoSQL! MongoDB ist eine der beliebtesten NoSQL-Datenbanken und bietet dem .NET-Entwickler einige Vorteile gegenüber bekannter SQL-Datenbanken. Der MongoDB-Experte Gregor Biswanger zeigt in seiner Session dazu einen perfekten Überblick und einige Tipps zum Einstieg aus der Praxis.
1. Yes zu NoSQL mit MongoDB
Für .NET-Entwickler
Gregor Biswanger | Freier Berater, Trainer, Autor und Sprecher
about.me/gregor.biswanger
2. Über mich
▪ Freier Berater, Trainer und Autor
▪ Schwerpunkte: Softwarearchitektur, Web und
Cross-Plattform Entwicklung mit JavaScript
▪ Technologieberater für die Intel Developer Zone
▪ Internationaler Sprecher auf Konferenzen und
User Groups
▪ Freier Autor für heise.de, dotnetpro,
WindowsDeveloper und viele weitere
Fachmagazine
▪ Video-Trainer bei video2brain und Microsoft
Gregor Biswanger
Microsoft MVP, Intel Black Belt &
Intel Software Innovator
cross-platform-blog.de
about.me/gregor.biswanger
3. Unser Reiseplan
▪ Einstieg in MongoDB mit C#
▪ Immobilien App in ASP.NET Core
▪ Verbindung aufbauen
▪ Dokumente erzeugen
▪ Speichern und Verändern
▪ Abfragen
▪ GridFS
▪ LINQ-Support
▪ Fluent Aggregation API
▪ CRUD
▪ Eventing
▪ Joins
5. Was ist MongoDB?
▪ Steht für das Englische Wort: humongous
(Enorm)
▪ Eine Open-Source Datenbank
▪ Veröffentlicht 2009
▪ Eine dokumentenorientierte NoSQL-
Datenbank
▪ Die Dokumente basieren auf JSON/BSON
▪ Läuft auf Windows, Mac und Linux
▪ MongoDB ist mit offiziellen Treibern
ausgestattet für C, C++, C#, Haskell, Java,
JavaScript, Lisp, Perl, PHP, Python, Ruby und
Scala
▪ Bester Entwickler-Komfort ist mit JavaScript
(Node.js)
Download
mongodb.org
6. Installation unter Windows
▪ MongoDB kann ohne
Abhängigkeiten direkt
heruntergeladen und
ausgeführt werden
▪ http://www.mongodb.com
▪ Installation wird über
einen Installer
empfohlen, für
automatisches festlegen
vom Pfad etc.
▪ Empfohlen wird für das
Produktivsystem nur die
64-Bit Version
8. Der Mongo Daemon
▪ Ist der MongoDB Service
▪ Wird ausgeführt über mongod (Linux) oder mongod.exe (Windows)
▪ Kann direkt ausgeführt werden oder benötige Installation von
Frameworks etc.
▪ Standardverzeichnis für die DB:
▪ Windows: „datadb“
▪ Linux: „/data/db“ – Ubuntu „/var/lib/mongodb“
▪ Standard Port: 27017
9. Die Mongo Shell
▪ Ein CLI-Tool um interaktiv auf die MongoDB
zugreifen zu können
▪ Datenzugriff
▪ Administration
▪ Wird ausgeführt über mongo (Linux) oder
mongo.exe (Windows)
▪ Interaktives JavaScript Interface
▪ Läuft auf der JavaScript-Engine SpiderMonkey (Mozilla)
▪ JavaScript-Dateien können ebenfalls als
automatisierte Script-Dateien hinterlegt werden
10. Robo 3T
▪ Kostenloses Verwaltungstool für
den Desktop
▪ Hieß früher Robomongo
▪ Läuft Cross-Plattform:
Windows, Mac und Linux
▪ Als Portable oder über Setup
▪ Studio 3T ist die
kostenpflichtige Enterprise
Version
Download
robomongo.org
12. Identifizierung
▪ Die wichtigste Regel für Dokumente: Sie benötigen ein _id Feld
▪ Unterstütze Datentypen als ID:
▪ Number
▪ String
▪ Object
▪ ISODate()
▪ Nicht Unterstützer Datentyp:
▪ Array (Obwohl es auch vom Typ Object ist)
13. ObjectId
▪ Wenn kein _id Feld definiert
wurde, wird automatisch eine
ID mit der ObjectId-Funktion
festgelegt
▪ Eine mit ObjectId definierte ID,
beinhaltet einen Timestamp
▪ Das erspart ein zusätzliches
Feld wie z.B. CreatedTime
> db.foo.save({ name: "Max Mustermann" });
WriteResult({ "nInserted" : 1 })
> db.foo.find()
{ "_id" : ObjectId("5b0213dc7bb4413b6883cb05"),
"name" : "Max Mustermann" }
> db.foo.find()[0]._id.getTimestamp()
ISODate("2018-05-21T00:33:32Z")
14. Support für C#
▪ Der Mongo C# Driver ist die offizielle MongoDB API für C#
▪ NuGet MongoDB.Driver
▪ Open-Source auf GitHub
▪ https://github.com/mongodb/mongo-csharp-driver
▪ Support für
▪ Native Kommandos via Fluent Aggregation API
▪ LINQ
▪ Events
▪ GridFS
▪ Async-Await Support
66. Replace oder Update?
▪ Für OOP-Entwickler ist das einfache Ersetzen beliebt
▪ Beim Ersetzen wird das Dokument erst geladen, verändert
und abgespeichert
▪ Beim Update wird direkt beim Datensatz der Wert verändert
▪ Ein Update ist daher wesentlich Performanter
▪ Ein Update sorgt ebenfalls für stabilere Datenzustände
(Verringert Concurrency-Probleme)
93. LINQ Support
▪ Die AsQueryable-Methode erweitert eine MongoCollection um die
LINQ-Funktionalität
▪ LINQ-Befehle werden direkt als native Aggregation-Befehle
übersetzt
▪ Ideal für komplexe Abfragen
▪ http://mongodb.github.io/mongo-csharp-driver/2.7/reference/driver/crud/linq/
97. Die Fluent Aggregation API
▪ Die Aggregate-Methode erweitert eine MongoCollection um
weitere Extension-Methods, die direkt hintereinander Aufgerufen
werden können
▪ Diese basieren auf den gleichen nativen Mongo-Operatoren
▪ Project, Group, SortBy, Match, Limit, Skip, Unwind usw.
▪ Ideal für komplexe Abfragen
100. LINQ vs. Fluent Aggregation API
▪ Beide sind ideal für komplexe Abfragen
▪ LINQ-Abfragen werden in den meisten Fällen sehr gut in native
Abfragen übersetzt
▪ LINQ ist ideal für .NET-Entwickler, die es bereits gewohnt sind damit zu
arbeiten
▪ Fluent Aggregation API, ist ideal für Entwickler die eher die native
Mongo API gewohnt sind
▪ Oder mehr Kontrolle über den tatsächlichen Abfragecode zur
Datenbank möchten
▪ In der Regel sollte sich ein Team darüber vorher abstimmen, welche der
beiden Möglichkeiten Hauptsächlich zum Einsatz kommen soll
107. Eventing
▪ Der Mongo C# Driver bietet unterschiedliche Events an
▪ Es hilft beim Logging oder bei der Diagnose der
Datenkommunikation
▪ Es gibt unterschiedliche Event Types
▪ http://mongodb.github.io/mongo-csharp-driver/2.7/reference/driver_core/events/
108. Event Types
▪ Allgemein
▪ ConnectionPoolAddedConnectionEvent
▪ Command-Events
▪ CommandStartedEvent, CommandSucceededEvent und
CommandFailedEvent
▪ Es sollten keine unnötigen Command-Events abonniert werden, da dies
unnötig die Performance beeinflusst
111. Joins
▪ Dokumentenorientierte Datenbanken sollten in der Regel atomare
Dokumente beinhalten
▪ Es ist dennoch legitim unabhängige Dokumente zu erzeugen, die
eine Beziehung zueinander haben
▪ Das Zusammenführen beider Dokumente kann Client- und Server-
Seitig durchgeführt werden
▪ Die Client-Seitige Lösung wird aus Performancesicht nicht
empfohlen (Doppelte Anfragen an den Server)
▪ Server-Seitig bietet MongoDB dazu den Lookup-Operator