Hallo MongoDB

Die letzten Tage habe ich MongoDB auf meiner neuen VM installiert und ein wenig damit herumgespielt. Das, was ich auf den ersten Blick gesehen habe, gefällt mir.

MongoDB ist eine NoSQL-Datenbank, d.h. die Daten werden nicht wie in einer relationalen Datenbank in Tabellen mit gleichartig strukturierten Zeilen gespeichert, sondern in Collections (Sammlungen) von Dokumenten. Die Dokumente einer Sammlung haben zwar in der Regel die gleiche Struktur (statt Spalten haben sie Felder), aber das muss nicht unbedingt sein. Vor allem aber können die Felder von Dokumenten selbst wieder Arrays oder Dokumente sein.

Damit lassen sich manche Aufgabenstellungen, für die relationale Datenbanken drei Tabellen benötigen, elegant und einfach mit nur einer Sammlung lösen. Will ich beispielsweise eine Sammlung von Benutzern eines Systems anlegen und bei den Benutzern deren Rollenzugehörigkeit vermerken, dann sieht ein Dokument ungefähr so aus:

{
    "name"  : "Michael",
    "email" : "mw@michaelwegelin.com",
    "roles" : ["admin", "author", "user"]
}

Dokumente in MongoDB sehen also ähnlich aus wie JavaScript Object Notation (JSON) Dokumente. Bei einer relationalen Datenbank hätte ich dafür drei Tabellen gebraucht: Eine für die Benutzer, eine für die Rollen und eine dritte für die Beziehungen zwischen Benutzern und ihren Rollen. Hier in MongoDB wird diese Beziehung durch ein eingebettetes Array hergestellt.

MongoDB finden Sie auf mongoDB.org. Das Handbuch finden Sie dort unter http://docs.mongodb.org/manual/, ein Einsteigertutorial unter http://docs.mongodb.org/getting-started/shell/.

Unter Ubuntu installieren Sie MongoDB am einfachsten mit der Paketverwaltung apt-get:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" 
       | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org

Der erste Befehl lädt den öffentlichen Schlüssel herunter, mit dem das MongoDB-Paket signiert ist. Der zweite Befehl (hier auf zwei Zeilen umgebrochen) erzeugt eine sogenannte List-Datei (/etc/apt/sources.list.d/mongodb-org-3.0.list) für MongoDB . Diese Datei wird von apt-get benötigt, um die Installationspakete zu finden. Der dritte Befehl aktualisiert die Paketdatenbank von apt-get und der vierte und letzte Befehl installiert die Datenbank.

Auf meinem System wurde der Datenbankserver schon gleich gestartet. Dies geht aber auch mit

sudo service mongod start

und gestoppt wird er mit

sudo servive mongod stop

Achtung: Der Service heißt tatsächlich mongod, ohne b am Ende!

Nach der Installation werden mit der MongoDB-Shell natürlich gleich mal die ersten Gehversuche unternommen. Der Befehl mongo startet eine Oberfläche (Shell), mit der Sie interaktiv mit dem MongoDB Server arbeiten können. Der Befehl help gibt eine Liste der möglichen Befehle aus. Beispielsweise können Sie sich mit show dbs eine Liste der Datenbanken ausgeben lassen. Mit use test wechseln Sie zur Datenbank namens test, mit show collections wird Ihnen eine Liste der Collections in der Datenbank angezeigt.

Mit db.users.insert({"name" : "Michael", "email" : "mw@michaelwegelin.com", "roles" : ["admin", "author", "editor"]}) fügen Sie ein neues Dokument in die Collection users ein, die Sie damit auch gleich erzeugt haben. Mit db.users.find() können Sie sich dann denn Inhalt dieser Collection anzeigen lassen:

> show dbs
local  0.078GB
test   0.078GB

> use test
switched to db test

> show collections
system.indexes

> db.users.insert({"name": "Michael", "email" : "mw@michaelwegelin.com", 
                   "roles" : ["admin", "author", "editor"] })
WriteResult({ "nInserted" : 1 })

> db.users.find()
{ "_id" : ObjectId("555debfa5dcfe5b917031fa5"), "name" : "Michael", "email" :     "mw@michaelwegelin.com", "roles" : [ "admin", "author", "editor" ] }
>

Wie Sie sehen, vergibt MongoDB beim Einfügen eines neuen Objekts gleich eine Objekt-Id. Der Methode find() können Sie auch ein Filterobjekt übergeben, um nach Objekten mit ganz bestimmten Kriterien zu suchen:

> db.users.find( { "name" : "Michael" } )
{ "_id" : ObjectId("555debfa5dcfe5b917031fa5"), "name" : "Michael", "email" :     "mw@michaelwegelin.com", "roles" : [ "admin", "author", "editor" ] }

> db.users.find( { "roles" : "admin" } )
{ "_id" : ObjectId("555debfa5dcfe5b917031fa5"), "name" : "Michael", "email" : "mw@michaelwegelin.com", "roles" : [ "admin", "author", "editor" ] }

Mit db.users.remove() können Sie ein oder mehrere Objekte aus einer Collection löschen. Dabei müssen Sie ebenfalls ein Filterobjekt übergeben, das die zu löschenden Objekte identifiziert. Ist das Filterobjekt das leere Objekt {}, dann werden alle Dokumente aus der Collection gelöscht. Mit db.users.drop() löschen Sie die gesamte Collection:

> db.users.remove({})
WriteResult({ "nRemoved" : 1 })

> db.users.find()

> show collections
system.indexes
users

> db.users.drop()
true

> show collections
system.indexes

Damit ist alles wieder weg ;-)

Das soll für die ersten Gehversuche erst mal genügen. Für Freunde der bewegten Bilder gibt es das ganze hier auch als Video:

Viel Spaß mit MongoDB!

Michael Wegelin

Hallo, ich bin Michael Wegelin. Ich arbeite als Redner, Autor und Trainer. Ich lese viel, probiere es aus, und dann erkläre ich es jedem der es wissen will.

Ulm