.. include:: global.rst MongoDB ===================================== .. index:: MongoDB Einführung ---------- MongoDB ist eine dokumentenorientierte, NoSQL-Datenbank, die für ihre flexible und skalierbare Architektur bekannt ist. Im Gegensatz zu traditionellen relationalen Datenbanken speichert MongoDB Daten in Dokumenten, die in BSON (Binary JSON) codiert sind, anstatt in Tabellen. Auf Grund dessen gibt es keine strikte Schema-Struktur, wie bei relationalen Datenbanken. Die Entwickler können Daten in MongoDB flexible modellieren und anpassen, um den Anforderungen zu entsprechen. Die Dokumente können viele verschiedene Datentypen wie Text, Zahlen, Datum und Zeitstempel, Geodaten und Binärdaten enthalten. Mit die größte stärke von MongoDB ist die Skalierbarkeit. Sie kann sowohl vertikal (mehr Kapazität auf einem Server) und horizontal (Cluster-Konfiguration/weitere Knoten) skaliert werden. Vorbereitungen -------------- Die frei verfügbare Open-Source-Edition "Community Server" sowie die kommerzielle Enterprise-Lösung können im Download-Center auf der offiziellen `MongoDB-Website `_ heruntergeladen werden. Außerdem gibt es noch MongoDB-Atlas, eine Plattform für das Betreiben der Datenbank in den verschiedenen Cloud-Providern wie Azure, AWS und GCP. Für diesen Versuchsaufbau ist allerdings die Community-Edition vollkommen ausreichend. Diese kann sehr einfach mithilfe von Docker auf dem lokalen Rechner und dem Befehl .. code-block:: bash docker run -d -p 27017:27017 --name test-mongo mongo:latest hochgefahren werden. Dabei wird die neueste Version des mongoDB-Images aus der Docker-Registry gepullt und gestartet. Der Standardport, auf dem die Datenbank erreichbar ist (27017) wird zudem auf den Host gebindet und kann nun für Abfragen verwendet werden. Vergleich relationale Datenbank ------------------------------- **1. Datenmodell:** In MongoDB wird das Datenmodell als Dokument bezeichnet, während in einer relationalen Datenbank Daten in Tabellen organisiert werden. Ein Dokument ist eine Sammlung von Feldern mit Werten, die ähnlich wie JSON-Objekte strukturiert sind. .. image:: img/experiment2/data_structures.jpg :width: 70% In MongoDB werden Daten, die zusammen gehören, auch zusammen gespeichert. Man kann beim anlegen eines Dokuments einem Key mehrere Values zuordnen. Zudem ist MongoDB typflexibel. **2. Skalierbarkeit:** MongoDB wurde von DoubleClick entwickelt, die Probleme mit schnell wachsenden Datenmengen hatten. Während bei SQL-Datenbanken die Server fast nur vertikal skaliert werden können, erlaubt Mongo DB eine einfache horizontale Skalierung. Das wird ermöglicht, durch das Speichern in Dokumenten, während bei SQL die Tabellen immer größer werden, und schlecht aufgeteilt werden können. .. image:: img/experiment2/scaling.png :width: 70% **3. Abfragesprache:** MongoDB verwendet eine Abfragesprache namens MongoDB Query Language (MQL), die auf JavaScript-Objekten und JSON basiert. In einer relationalen Datenbank wird SQL verwendet, um Abfragen durchzuführen. .. image:: img/experiment2/mongo_sql_queries.png :width: 70% **4. Datenintegrität:** Relationale Datenbanken sind bekannt für ihre Datenintegrität, da sie die Integritätsregeln wie Primärschlüssel, Fremdschlüssel, Eindeutigkeit usw. erzwingen. MongoDB hingegen legt die Datenintegrität in die Hände des Entwicklers, um sicherzustellen, dass die Daten ordnungsgemäß validiert werden. **5. Flexibilität:** MongoDB ist flexibler als eine relationale Datenbank. Es ermöglicht beispielsweise das Hinzufügen oder Entfernen von Feldern innerhalb eines Dokuments, ohne dass ein Schema geändert werden muss. **6. Geschwindigkeit:** MongoDB kann sehr schnell sein, insbesondere bei Abfragen, die auf Dokumenten abzielen, die zusammengehören. Dies liegt daran, dass MongoDB alle Daten, die zu einem Dokument gehören, in einem einzelnen Eintrag speichert. In einer relationalen Datenbank müssen die Daten möglicherweise aus verschiedenen Tabellen abgerufen und zusammengeführt werden, was zu langsameren Abfragen führen kann. .. image:: img/experiment2/performance.png :width: 50% Abfragefunktionen ----------------- **1. Datenbank auswählen oder erstellen:** Die Datenbank dva wird ausgewählt, existiert diese nicht, wird sie erstellt. Allerdings wird sie erst wirklich erstellt, sobald sie Daten enhält. Beispiel:: use dva **2. Sammlung auswählen oder erstellen:** Variante 1: Sammlung über die Funktion createCollection() erstellen:: db.createCollection("news") Variante 2: Sammlung direkt beim insert automatisch erstellen. Existiert die Sammlung des inserts nicht, wird diese erstellt:: db.news.insertOne(object) **3. Validierung** Es können Schemavalidierungsregeln erstellt werden, um sicherzustellen, dass alle Dokumente einer Sammlung eine ähnliche Struktur aufweisen. Beispiel:: db.createCollection("posts", { validator: { $jsonSchema: { bsonType: "object", required: [ "title", "body" ], properties: { title: { bsonType: "string", description: "Title of post - Required." }, body: { bsonType: "string", description: "Body of post - Required." }, category: { bsonType: "string", description: "Category of post - Optional." }, likes: { bsonType: "int", description: "Post like count. Must be an integer - Optional." }, tags: { bsonType: ["string"], description: "Must be an array of strings - Optional." }, date: { bsonType: "date", description: "Must be a date - Optional." } } } } }) **4. Daten einfügen:** Einzelnes Dokument einfügen:: db.posts.insertOne({ title: "Post Title 1", body: "Body of post.", category: "News", likes: 1, tags: ["news", "events"], date: Date() }) Mehrere Dokumente einfügen:: db.posts.insertMany([ { title: "Post Title 2", body: "Body of post.", category: "Event", likes: 2, tags: ["news", "events"], date: Date() }, { title: "Post Title 3", body: "Body of post.", category: "Technology", likes: 3, tags: ["news", "events"], date: Date() }, { title: "Post Title 4", body: "Body of post.", category: "Event", likes: 4, tags: ["news", "events"], date: Date() } ]) **5. Suche:** Die `find`-Funktion ermöglicht das Abrufen von Dokumenten aus einer Sammlung basierend auf einem Filter, der als Argument übergeben wird. Der Filter kann Bedingungen enthalten, um Dokumente auf bestimmten Kriterien zu filtern. Eine optionale `projection` kann verwendet werden. Beispiel:: db.collection.find({ field: value }) **6. Projektion:** Mit der Projektion-Funktion können Sie angeben, welche Felder aus den abgerufenen Dokumenten zurückgegeben oder ausgelassen werden sollen. Beispiel:: db.collection.find({ name: "John" }, { name: 1, age: 1, _id: 0 }) **7. Vergleichsoperatoren:** Es gibt verschiedene Vergleichsoperatoren um komplexe Abfragen mit Bedingungen zu erstellen. ========== ======================================================= Operator Beschreibung ========== ======================================================= $eq Werte sind gleich $ne Die Werte sind nicht gleich $gt Wert ist größer als ein anderer Wert $gte Wert ist größer als oder gleich einem anderen Wert $lt Wert ist kleiner als ein anderer Wert $lte Wert ist kleiner als oder gleich einem anderen Wert $in Wert ist innerhalb eines Arrays übereinstimmend ========== ======================================================= Beispiel:: db.collection.find({ age: { $gte: 18, $lt: 30 } }) **8. Logische Operatoren:** Es gibt auch logische Operatoren, die verwendet werden können, um Abfragen mit mehreren Bedingungen zu kombinieren oder Negationen durchzuführen. ========== ======================================================= Operator Beschreibung ========== ======================================================= $and Gibt Dokumente zurück, bei denen beide Suchanfragen übereinstimmen $or Gibt Dokumente zurück, bei denen eine der beiden Abfragen übereinstimmt $nor Gibt Dokumente zurück, bei denen beide Abfragen nicht übereinstimmen $not Gibt Dokumente zurück, bei denen die Abfrage nicht übereinstimmt ========== ======================================================= Beispiel:: db.collection.find({ $or: [ { age: { $lt: 18 } }, { age: { $gte: 65 } } ] }) **9. Textsuche:** MongoDB ermöglicht auch die Durchführung von Textsuchen in den Dokumenten einer Sammlung mit der `$text`-Abfragefunktion. Beispiel:: db.collection.find({ $text: { $search: "keyword" } }) **10. Sortierung:** Man kann die `sort`-Funktion verwenden, um die Ergebnisse der Abfrage nach bestimmten Feldern zu sortieren, entweder aufsteigend oder absteigend. Beispiel:: db.collection.find().sort({ age: 1 }) **11. Aggregation:** MongoDB bietet leistungsstarke Aggregationsfunktionen, um komplexe Datenaggregationen und Transformationen durchzuführen. Aggregationsfunktionen können durch Pipelining hintereinandergeschaltet werden. ========== ======================================================= Funktion Beschreibung ========== ======================================================= $group Gruppiert Dokumente $limit Begrenzt die Anzahl der Dokumente, die an die nächste Stufe weitergegeben werden. $project Gibt nur die angegebenen Felder an die nächste Aggregationsstufe weiter. $sort Sortiert alle Dokumente in der angegebenen Sortierreihenfolge $match Verhält sich wie eine Suche. Sie filtert Dokumente, die mit der angegebenen Abfrage übereinstimmen. $addFields Fügt dem Dokumente neue Felder hinzu. $count Zählt die Gesamtzahl der Dokumente, die in der vorherigen Stufe übergeben wurden. $lookup Führt einen Left-Outer-Join zu einer Sammlung in derselben Datenbank durch. $lookup Schreibt die von der Aggregationspipeline zurückgegebenen Dokumente in eine Sammlung. ========== ======================================================= Beispiel:: db.collection.aggregate([ { $match: { status: "active" } }, { $group: { _id: "$city", total: { $sum: "$amount" } } } ]) MongoDB Playground Beispiel --------------------------- MongoDB Playground für VS Code: https://www.mongodb.com/docs/mongodb-vscode/ Datenbank starten:: docker run -d -p 27017:27017 --name test-mongo mongo:latest Datenbankverbindung:: mongodb://localhost Code:: // Findet Nachrichten am 06.04.23 function printNewsFrom06_04_23(){ console.log(`${ db.getCollection('news').find({ date: { $gte: new Date('2023-04-06'), $lt: new Date('2023-04-07') } }).count() } Nachtichten am 06.04.23`); }; // Auswahl der Datenbank DVA_PRAK use('DVA_PRAK'); // Datenbank löschen db.dropDatabase(); // Sammlung mit Validierung erstellen db.createCollection("news", { validator: { $jsonSchema: { bsonType: "object", required: [ "headline", "date", "author" ], properties: { headline: { bsonType: "string", description: "Titel - Required." }, date: { bsonType: "date", description: "Datum - Optional." }, category: { bsonType: "string", description: "Kategorie - Optional." }, author: { bsonType: "string", description: "Author - Required." }, content: { bsonType: "string", description: "Inhalt - Required." } } } } }) // Einträge in die Kollektion News importieren. Wenn die Kollektion nicht existiert, wird sie automatisch erstellt db.news.insertMany([ { "headline": "Scientists Discover New Species of Butterfly in Amazon Rainforest", "date": new Date("2023-04-06T08:00:00Z"), "category": "Science", "author": "John Smith", "content": "A team of scientists exploring the Amazon rainforest has made an exciting discovery - a previously unknown species of butterfly! The newly discovered butterfly, named Morpho amazonica, features unique wing patterns and is believed to be endemic to a small region of the rainforest. Researchers are thrilled with the find as it highlights the incredible biodiversity of the Amazon and underscores the importance of protecting this fragile ecosystem. Further studies are underway to understand the life cycle, behavior, and ecological role of this newly discovered species." }, { "headline": "Breaking: Earthquake Strikes California, Causes Minor Damage", "date": new Date("2023-04-06T08:00:00Z"), "category": "Breaking News", "author": "John Smith", "content": "A moderate earthquake with a magnitude of 5.8 struck California earlier today, shaking buildings and rattling nerves. The epicenter was located near Los Angeles, and there have been reports of minor damage to structures, including cracked walls and broken windows. Fortunately, there have been no reports of injuries or casualties at this time. The quake lasted for approximately 30 seconds and was felt across a wide area. Seismologists are closely monitoring the situation for any aftershocks and urging residents to remain vigilant and prepared for potential further seismic activity." }, { "headline": "Technology Giant Unveils Revolutionary New Smartphone with Advanced AI Features", "date": new Date("2023-04-12T08:00:00Z"), "category": "Technology", "author": "David Chen", "content": "A leading technology company has announced the launch of its latest flagship smartphone, the XYZPhone X. The XYZPhone X boasts cutting-edge artificial intelligence (AI) features that are set to redefine the smartphone experience. The phone's AI-powered camera system can automatically identify and optimize settings for different scenes, such as low-light conditions or fast-moving subjects, to capture stunning photos and videos. The device also features a virtual assistant that uses advanced natural language processing (NLP) to provide personalized recommendations and make tasks easier and more efficient. With its sleek design, powerful performance, and innovative AI capabilities, the XYZPhone X is generating buzz among tech enthusiasts and is expected to set a new standard in the smartphone industry." }, { "headline": "New Study Reveals Alarming Decline in Global Bee Population", "date": new Date("2023-04-13T08:00:00Z"), "category": "Environment", "author": "David Chen", "content": "A recent study published in the journal Nature has raised concerns about the declining bee population worldwide. The study, conducted by a team of international researchers, found that the global bee population has declined by 25% over the past three decades. Bees play a critical role in pollinating plants, including many of the fruits, vegetables, and nuts that make up a significant portion of the human diet. The decline in bee populations could have far-reaching implications for food" } ]); printNewsFrom06_04_23(); // Datum anhand des Titels ändern db.news.updateOne( { headline: "New Study Reveals Alarming Decline in Global Bee Population" }, { $set: { date: new Date("2023-04-06T13:00:00Z") } } ) printNewsFrom06_04_23(); // Eintrag anhand des Titels löschen db.news.deleteOne({ headline: "New Study Reveals Alarming Decline in Global Bee Population" }); printNewsFrom06_04_23(); // Aggregat Nachrichten von 2023 nach Author gruppiert db.news.aggregate([ // Alle Nachrichten von 2023 { $match: { date: { $gte: new Date('2023-01-01'), $lt: new Date('2024-01-01') } } }, // Nach Author gruppieren und Anzahl ausgeben { $group: { _id: '$author', count:{$sum:1}}}, // Sortierung Anzahl aufsteigend { $sort: { "count": 1 } } ]); Ausgabe:: 2 Nachtichten am 06.04.23 3 Nachtichten am 06.04.23 2 Nachtichten am 06.04.23 [ { "_id": "David Chen", "count": 1 }, { "_id": "John Smith", "count": 2 } ] Fazit ----- Insgesamt ist MongoDB eine leistungsstarke NoSQL-Datenbank, die in einer Vielzahl von Anwendungsfällen eingesetzt werden kann. Es bietet eine flexible Datenmodellierung, Skalierbarkeit und Sicherheit, sowie eine schnelle Abfrageverarbeitung. MongoDB ist eine gute Wahl für Entwickler, die eine skalierbare und effiziente Datenbanklösung benötigen, die leicht zu installieren und zu verwenden ist. Literaturangaben ---------------- **Informationen:** https://www.mongodb.com/docs/manual/ https://www.w3schools.com/mongodb/ **Bilder:** Data Structure: https://expeed.com/when-to-use-sql-databases-vs-nosql-databases-making-the-right-decision/ Scaling: https://blog.seibert-media.net/wp-content/uploads/2020/10/Horizontale-und-vertikale-Skalierung.png Queries: https://learnsql.com/blog/sql-vs-mongo-query/mongodb-queries-vs-mysql-queries-4.png Performance: https://www.researchgate.net/profile/Nasser-Ghadiri/publication/281629941/figure/fig6/AS:325409976668167@1454595192768/Comparing-the-performance-of-updating-the-records-at-different-scales-times-are-in.png