MongoDB Tutorial

MongoDB (abgeleitet vom engl. humongous, „gigantisch“) ist eine dokumentenorientierte NoSQL-Datenbank, die in der Programmiersprache C++ geschrieben ist. Da die Datenbank dokumentenorientiert ist, kann sie Sammlungen von JSON-ähnlichen Dokumenten verwalten. So können viele Anwendungen Daten auf natürlichere Weise modellieren, da die Daten zwar in komplexen Hierarchien verschachtelt werden können, dabei aber immer abfragbar und indizierbar bleiben. [Wikipedia]

Mit dem folgenden Befehl kann der MongoDB Server gestartet werden. Jedoch muss der folgende Ordner zunächst einmal anlegelgt werden: C:\data\db. Hier werden die DB Daten gespeichert.
mongod

Mit dem folgenden Befehlt kann der default Ordner verändert werden:
mongod –path „…..“

Die folgende Seite zeigt eine Übersicht der Parameter, womit der Server gestartet werden kann z.B. mongod -f mongod.cfg

Mit ‚use mydb‘ wird eine Verbindung zu der Datenbank ‚mydb‘ hergestellt. Für den Fall, dass die Datenbank nicht existieren sollte, wird dieser generiert.
Mit ‚db,user.insertOne(…..)‘ wird ein neues Dokument (collection) generiert. Mongo generiert für den Datensatz eine unique ID.
Mit ‚db.user.find()‘ werden alle Datensätze der collection ‚user‘ angezeigt.

’show dbs‘ funktioniert ebenfalls.

Die Verschachtelung kann bis zu einer Tiefe von 100 vorgenommen werden. Die max. Dokument Größe liegt bei 16 MB pro Dokument.

CRUD Operationen

Create Operations
– db.collection.insertOne()
– db.collection.insertMany()

Read Operations
– db.collection.find() e.g. db.user.find({age: {$gt: 43}})

Update Operations
– db.collection.updateOne()
– db.collection.updateMany() e.g. updateMany({}, email: „test@test.com“)
– db.collection.replaceOne()

Delete Operations
– db.collection.deleteOne()
– db.collection.deleteMany() e.g. deleteMany({})

Bei $gt handelt es sich um ein Operator. Diese Übersicht zeigt, wie die Operatoren verwendet werden können. Um genauer zu sein, handelt es sich hierbei um ein ‚Query and Projection‘ Operator.

MongoDB unterscheidet 5 unterschiedliche Operator Gruppen.

Die Shell kommuniziert mit dem MongoDB Server. Dieser sendet die Anfrage bzw. den von uns eingegebenen Datensatz an den ‚Storage Engine‘, der für die Verarbeitung der Daten zuständig ist. Die ‚Engine‘ wird die Daten innerhalb der DB speichern und zum Teil auch für einen schnellen Zugriff innerhalb des Speichers vorhalten. Die ‚Engine‘ kann bei Bedarf durch eine andere ausgetauscht werden. Bei ‚WiredTiger‘ handelt es sich um die default Engine. Die Speicherung erfolgt nicht in Form von JSON sondern als BSON (Binary JSON) Binärdatei.

MongoDB bietet mit Compass die Möglichkeit, via UI auf die Datenbank zuzugreifen.

Eine JSON Datei kann wie folgt innerhalb der Datenbank importiert werden. In diesem Fall importiere ich ein Bericht der Polizeidienststelle zu den unschiedlichsten Verbrechen in der USA aus dem Jahre 2003 bis 2018:

mongoimport.exe incidents_14mb.json -d mydb -c sfgov –jsonArray

Bei ‚mydb‘ handelt es sich um die Datenbank und bei ’sfgov‘ um die Collection. Es wurde eine Collection mit 41.075 Dokumenten importiert.

Ich habs mir etwas einfach gemacht und den existierenden ‚example‘ JSON Datensatz aus dremio exportiert.

Innerhalb der Daten können wir mit dem folgenden Befehl z.B. nach Raubüberfällen suchen:

db.sfgov.find({ „Category“:{$eq: „ROBBERY“} })

Ich habe mir die Visualisierung der Raubüberfälle rein aus Interesse unter tableau anzeigen lassen:

Mit dem folgenden Befehl können wir detaillierte Informationen zu der Query erhalten:

db.sfgov.explain(„executionStats“).find({ „Category“:{$eq: „ROBBERY“} })

Unter anderem wird hier angezeigt, wie viel Zeit die Ausführung des Queries in Anspruch genommen hat:

Um die Geschwindigkeit der Abfrage zu erhöhen, können wir ein Index für die gewünschte Spalte generieren. In diesem Beispiel generiere ich ein Index für die Kategorie:
db.sfgov.createIndex({„Category“: 1})

Ein Index kann mit dem folgenden Befehl wieder gelöscht werden:
db.sfgov.createIndex({„Category“: 1})

Bei erneuten Aufruf der Query Informationen sehen wir, dass die Geschwindigkeit der Verarbeitung um 59% verbessert wurde:

Um zukünftig etwas mehr Sicherheit ins Spiel zu bringen, werden wir zunächst einmal ein ‚admin‘ Benutzer anlegen:

Der User kann wie folgt wieder gelöscht werden:
db.runCommand( { dropUser: „root“ } )

Anschließend muss der Server einmal angehalten werden:
db.shutdownServer()
exit

Der Server muss mit dem –auth Parameter gestarte werden, damit der Anwender sich gegenüber der DB-Server Authentifizieren muss:
mongod –auth
oder
mongod –auth –port 27017 –dbpath C:\data\db

Die Informationen können nicht mehr ohne eine Authentifizierung aufgerufen werden:

Es besteht auch die Möglichkeit, die Authentifizierung permanent innerhalb der MongoDB Konfigurationsdatei ‚C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg‘ zu aktivieren:

Der Zugriff kann anschließend nur noch mit einem User, der die entsprechende Zugriffsrechte hat erfolgen. Den User kann man wie folgt anlegen:

Die Authentifizierung wird wie folgt vorgenommen:
mongo -u „root“ -p „root“ –authenticationDatabase „admin“

Für die Sicherung der Übertragung kann SSL eingesetzt werden. Die benötigte *.pem Datei kann wie folgt erstellt werden. Als ‚Common Name‘ muss die Server Adresse angegeben werden:

openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out
C:\ssl\mongodb.crt -keyout C:\ssl\mongodb.key

Generierung der *pem Datei:
type C:\ssl\mongodb.crt C:\ssl\mongodb.key > C:\ssl\mongodb.pem

Der Server kann anschließend mit dem folgenden Kommando gestartet werden:
mongod –sslMode requireSSL –sslPEMKeyFile C:\ssl\mongodb.pem

Um die existierende MongoDB Verbindung zu Löschen, kann der folgende Befehl ausgeführt werden:
db.shutdownServer()

Die Verbindung zum Server kann anschließend wie folgt vorgenommen werden:
mongo -ssl -sslCAFile C:\ssl\mongodb.pem –host localhost

Mit Atlas haben wir die Möglichkeit, MongoDB als Service zu nutzen. Ich werde mich hier für AWS entscheiden.

Atlas Admin anlegen:

Zugriff auf die eigene IP einschränken:

Der popup zeigt die verbleibende Schritte an:

Verbindung via Shell herstellen:

…..