MongoDb Cheatsheet

NoSQL

  • Key-Value-Stores unterstützen oft nur get, put und delete Operationen auf einen Primärschlüssel.
  • Document-Stores ähneln den Key-Value-Stores, speichern aber den Value in einem Format. Bei MongoDb ist es ein JSON-Format. Es kann dann zusätzlich auf die Informationen im Document gefiltert werden oder sogar nur ein Teil des Documents zurückgegeben werden. Transaktionen sind in der Regel pro Document, können je nach Datenbank aber auch mehrere Documents umfassen.

Ein wesentlicher Unterschied von allen NoSQL Datenbanken zu den relationalen Datenbanken ist die Transaktionssicherheit. Während die relationalen Datenbanken auf ACID-Transaktionen also atomar, konsistent, isoliert und dauerhafte Transaktionen, sind NoSQL-Datenbanken eher BASE also verfügbar, skalierbar, eventuell konsistent. Letzteres hat einen grossen Vorteil.

Eventuell konsistent bedeutet, dass der ganze Cluster, das sind Datenbanken, die untereinander synchronisiert werden, irgendwann den gleichen Datenstand hat. Das DNS-System ist nicht immer konsistent, ist es aber irgendwann, sofern keine Updates mehr kommen.

Der grosse Vorteil von eventuell konsistent liegt darin, dass die Datenbanken sich nicht immer absprechen müssen, sobald ein Update passiert. So kann ein Netzwerkfehler zwischen zwei Datenbanken nichts bewirken, da die Primärdatenbank dann noch Updates zulässt und alle Sekundär-Datenbanken auf Lesezugriff umschalten.

Mongo-Db

Terminologie

  • Eine Table ist in Mongo-Db eine Collection
  • Eine Row ist in Mongo-Db ein Document
  • Eine RowId ist in Mongo-Db der _id key
  • Ein Join kann mit der aggregate-Funktion gemacht werden
  • Ein Select wird mit der find-Funktion gemacht.

Cluster

Bei Mongo-Db kann man mehrere Datenbanken zusammenschalten, sodass sie einen Cluster bilden. Die Primärdatenbank wird dann automatisch gewählt. Sollte ein Netzwerkfehler auftreten, sodass nicht mehr alle Datenbanken untereinander kommunizieren können, wählen sich die Datenbanken, die die Mehrheit vertreten eine neue Primärdatenbank.

Query-Beispiele

db.unicorns.insert({
	name: "Aurora", 
 	gender: "f",
	weight: 450, 
	loves: ["apple", "grape"], 
	birthday: new ISODate('2013-04-15')
})
db.unicorns.find({	
	gender:"f",
	loves:"apple"
})
	
db.unicorns.update(
	{name: "Roooooodles"},
	{$set: {weight: 590}}, 
	{upsert: false}
)
db.unicorns.update(
	{name: "Aurora"}, 
	{$push: {loves: "sugar"}}
)
db.unicorns.find({
	gender:"m", 
	$and:[{weight:{$gte:600}}, {weight:{$lte:900}}]
})
db.address.aggregate([
	{$match: {street: "Blumenstrasse 13"}},
	{$lookup : {
		from: "persons", 
		localField: "_id", 
		foreignField: "address", as: "persons"}},
	{$project: {_id: 0, street: 1}}
])
Avatar
Thomas Elsensohn
Software- & Dataengineer