Rückblick: MongoDB erobert die Welt

Wenn Sie in den letzten Jahren eine mittelgroße bis große Webanwendung erstellt haben, haben Sie wahrscheinlich in Betracht gezogen, sie auf den Open-Source-LAMP- oder MEAN-Stack zu stützen. Der ältere LAMP-Stack verwendet das Linux-Betriebssystem, den Apache-Webserver, die relationale MySQL-Datenbank und die Programmiersprache PHP. MEAN verwendet die MongoDB NoSQL-Datenbank, das Express-Back-End-Webanwendungsframework, die Angular-Anwendungsplattform und die JavaScript-Laufzeit von Node.js. MEAN ist im Wesentlichen ein End-to-End-JavaScript-Stack. Linux wird im Akronym nicht explizit erwähnt, ist jedoch normalerweise das Betriebssystem unter Node.

In diesem Test werde ich auf die MongoDB-Datenbank in Version 4 eingehen. MongoDB ist eine hoch skalierbare, betriebsbereite Datenbank, die sowohl in Open Source- als auch in kommerziellen Unternehmensversionen verfügbar ist und lokal oder als verwalteter Cloud-Dienst ausgeführt werden kann. Der verwaltete Cloud-Dienst heißt MongoDB Atlas.

MongoDB ist mit Abstand die beliebteste NoSQL-Datenbank. Das Dokumentdatenmodell bietet Entwicklern große Flexibilität, während die verteilte Architektur eine große Skalierbarkeit ermöglicht. Daher wird MongoDB häufig für Anwendungen ausgewählt, die große Datenmengen verwalten müssen, von horizontaler Skalierbarkeit profitieren und Datenstrukturen verarbeiten, die nicht zum relationalen Modell passen.  

Da MongoDB für eine Vielzahl von Anwendungsfällen geeignet ist, wird es häufig als Ersatz für relationale Datenbanken verwendet. Obwohl die Freiheit von starren Schemaeinschränkungen häufig von Vorteil ist, ist es wichtig zu berücksichtigen, dass keine Dokumentendatenbank eine universelle Lösung ist - nicht einmal MongoDB.

MongoDB Ursprünge

Das Unternehmen hinter MongoDB wurde 2007 als 10gen von einem Team gegründet, das hinter DoubleClick, dem Internet-Werbeunternehmen, stand. Die ursprüngliche Motivation für die MongoDB-Datenbank bestand darin, die für Internetwerbung erforderliche Flexibilität und Skalierbarkeit zu bewältigen. Als Beispiel für die Skalierung lieferte DoubleClick 2007 400.000 Anzeigen pro Sekunde und hatte Probleme, mit den vorhandenen Datenbanken der damaligen Zeit zu arbeiten.

MongoDB ist ein dokumentbasierter Speicher, auf dem auch ein grafischer Speicher implementiert ist. Die anderen Arten von NoSQL-Datenbanken sind Schlüsselwertspeicher und spaltenbasierte Speicher. Alle Arten von NoSQL-Datenbanken können gemeinsam auf eine Weise skaliert werden, die in den relationalen SQL-Datenbanken von 2007 nicht möglich war. Die verschiedenen Arten von NoSQL-Datenbanken weisen jedoch unterschiedliche Stärken, Schwächen und Anwendungsfälle auf.

Einige der wichtigsten NoSQL-Konkurrenten von MongoDB als Betriebsdatenbanken sind Amazon DynamoDB (Schlüsselwertspeicher), Google Cloud BigTable (Spaltenspeicher), Google Cloud-Datenspeicher (Dokumentenspeicher), Redis (In-Memory-, Schlüsselwertspeicher) und Couchbase (Schlüsselwert- und Dokumentenspeicher für mehrere Modelle), DataStax / Cassandra (Spaltenspeicher) und Azure Cosmos DB (Multimodell mit einer SQL-Option sowie mehreren NoSQL-Speichern).

Was ist MongoDB?

MongoDB Inc. beschreibt MongoDB als "eine Dokumentendatenbank mit der Skalierbarkeit und Flexibilität, die Sie für die Abfrage und Indizierung benötigen, die Sie benötigen." Um dies zu analysieren, müssen wir zunächst die Art einer Dokumentendatenbank verstehen, bei der es sich um eine der Arten von NoSQL-Designs handelt.

Anstatt stark typisierte Daten in verwandten normalisierten Tabellen mit festen Schemata wie einer relationalen Datenbank zu speichern, speichert eine Dokumentendatenbank verwandte Daten in de-normalisierter Form, eingebettet in JSON-ähnliche Namenswertdokumente. MongoDB nicht tatsächlich JSON speichern, aber: MongoDB speichert BSON (Binary JSON), die die JSON Darstellung erstreckt (strings) zusätzliche Typen umfassen , wie beispielsweise int, long, date, floating point, decimal128, und geospatial Koordinaten, wie unten in der Abbildung dargestellt. BSON-Dokumente enthalten ein oder mehrere Felder, und jedes Feld enthält einen Wert eines bestimmten Datentyps, einschließlich Arrays, Binärdaten und Unterdokumenten . BSON verfolgt auch die Größe jedes Dokuments, um eine effiziente Suche zu ermöglichen.

MongoDB

Die BSON-Eingabe fließt in die Indizierung von Feldern ein. MongoDB kann multimodale Diagramm-, Geodaten-, B-Baum- und Volltextindizes für eine einzelne Kopie der Daten generieren, wobei der Datentyp verwendet wird, um den richtigen Indextyp zu generieren. Mit MongoDB können Sie Indizes für jedes Dokumentfeld erstellen.

MongoDB

MongoDB verfügt über Datenbanken, Sammlungen (Tabellen), Dokumente (Zeilen), Felder (Spalten), Indizes $lookupoder eingebettete Dokumente (Verknüpfungen), Primärschlüssel, eine Aggregationspipeline und Transaktionen. Um eine bessere Leistung zu erzielen und die Notwendigkeit von Transaktionen mit mehreren Dokumenten zu vermeiden, möchten Sie wahrscheinlich Unterdokumente und Arrays in MongoDB verwenden, anstatt Ihre Daten in normalisierter Form wie in einer SQL-Datenbank zu speichern.

MongoDB 4 verfügt über Transaktionen mit mehreren Dokumenten. Dies bedeutet, dass Sie auch dann ACID-Eigenschaften erhalten können, wenn Sie Ihr Daten-Design normalisieren müssen. Frühere Versionen haben dies nicht getan.

Für das, was es wert ist, sagten mir MongoDB-Vertreter, dass Transaktionen mit einzelnen Dokumenten 90 Prozent der Anwendungsfälle behandeln, die ACID-Eigenschaften benötigen. Wenn Kunden ACID für Transaktionen mit mehreren Dokumenten vor Version 4 benötigten, implementierten sie es grundsätzlich selbst auf Anwendungsebene.

Standardmäßig verwendet MongoDB dynamische Schemas, die manchmal als schemalos bezeichnet werden. Die Dokumente in einer einzelnen Sammlung müssen nicht denselben Feldsatz haben, und der Datentyp für ein Feld kann je nach Dokument innerhalb einer Sammlung unterschiedlich sein. Sie können Dokumentstrukturen jederzeit ändern.

Schema-Governance ist jedoch verfügbar. Ab MongoDB 3.6 unterstützt MongoDB die JSON-Schemaüberprüfung. Verwenden $jsonSchemaSie zum Aktivieren den Operator in Ihrem Validator-Ausdruck. Die Überprüfung erfolgt während Aktualisierungen und Einfügungen.

Wie Sie im folgenden Dokumentationsschnappschuss und im Screenshot des MongoDB-Atlas sehen können, verfügt MongoDB über eine eigene Abfragesprache, die in der Mongo-Shell, in 12 unterstützten Sprachtreiber-APIs (und vielen weiteren aus der Community) sowie in der Compass-GUI und der Registerkarte "Atlas-Sammlungen" (Daten-Explorer). Die MongoDB-Abfragesprache ist überhaupt nicht mit SQL identisch, es besteht jedoch eine mehr oder weniger direkte Zuordnung zwischen beiden. Ich sage "mehr oder weniger", weil relationale Datenbanken eingebettete Dokumente nicht unterstützen, MongoDB jedoch. Das ist nicht unbedingt alles gut, wie Sie im nächsten Abschnitt sehen werden.

MongoDB MongoDB

Das MongoDB-Aggregationsframework verwendet Pipeline-Operatoren, die mehr oder weniger dem SQL GROUP BYund den WHEREKlauseln entsprechen. Bei der folgenden Abfrage wird beispielsweise die Benutzergruppendatenbank von MongoDB verwendet, um die vergangenen Ereignisse und die gesamten RSVPs für jedes Ereignis in der Mongo-Shell aufzulisten:

> db.past_events.aggregate ([{'$ match': {'batchID': 101, 'event.status': 'past', 'event.group.urlname': {'$ in': ['Atlanta-MongoDB -Benutzergruppe ',' Austin-MongoDB-Benutzergruppe ',' Baltimore-MongoDB-Benutzergruppe ',' Bangalore-MongoDB-Benutzergruppe ',' Belfast-MongoDB-Benutzergruppe ',' Bergen-NoSQL ',' Bordeaux-MongoDB-Benutzergruppe ',' Boston-MongoDB-Benutzergruppe ']}}},

{'$group': {'_id': {'urlname': '$event.group.urlname', 'year': {'$year': '$event.time'}}, 'event_count': {'$sum': 1}, 'rsvp_count': {'$sum': '$event.yes_rsvp_count'}}},

{'$project': {'_id': 0, 'group': '$_id.urlname', 'year': '$_id.year', 'event_count': 1, 'rsvp_count': 1}}])

The query uses the aggregate function with the $match, $in, $group, $sum, and $project operators and returns the following:

{ "event_count" : 2, "rsvp_count" : 27, "group" : "Boston-MongoDB-User-Group", "year" : 2017 }

{ "event_count" : 5, "rsvp_count" : 94, "group" : "Boston-MongoDB-User-Group", "year" : 2016 }

{ "event_count" : 5, "rsvp_count" : 231, "group" : "Boston-MongoDB-User-Group", "year" : 2015 }

{ "event_count" : 3, "rsvp_count" : 175, "group" : "Boston-MongoDB-User-Group", "year" : 2014 }

{ "event_count" : 10, "rsvp_count" : 489, "group" : "Boston-MongoDB-User-Group", "year" : 2013 }

{ "event_count" : 12, "rsvp_count" : 444, "group" : "Boston-MongoDB-User-Group", "year" : 2012 }

{ "event_count" : 2, "rsvp_count" : 118, "group" : "Boston-MongoDB-User-Group", "year" : 2011 }

{ "event_count" : 6, "rsvp_count" : 84, "group" : "Atlanta-MongoDB-User-Group", "year" : 2011 }

{ "event_count" : 3, "rsvp_count" : 74, "group" : "Baltimore-MongoDB-Users-Group", "year" : 2012 }

{ "event_count" : 1, "rsvp_count" : 5, "group" : "Bergen-NoSQL", "year" : 2015 }

{ "event_count" : 15, "rsvp_count" : 286, "group" : "Atlanta-MongoDB-User-Group", "year" : 2012 }

{ "event_count" : 11, "rsvp_count" : 321, "group" : "Baltimore-MongoDB-Users-Group", "year" : 2013 }

{ "event_count" : 8, "rsvp_count" : 124, "group" : "Bangalore-MongoDB-User-Group", "year" : 2015 }

{ "event_count" : 6, "rsvp_count" : 381, "group" : "Bangalore-MongoDB-User-Group", "year" : 2013 }

{ "event_count" : 7, "rsvp_count" : 242, "group" : "Bangalore-MongoDB-User-Group", "year" : 2012 }

{ "event_count" : 13, "rsvp_count" : 233, "group" : "Atlanta-MongoDB-User-Group", "year" : 2013 }

{ "event_count" : 10, "rsvp_count" : 171, "group" : "Baltimore-MongoDB-Users-Group", "year" : 2014 }

{ "event_count" : 3, "rsvp_count" : 28, "group" : "Austin-MongoDB-User-Group", "year" : 2017 }

{ "event_count" : 2, "rsvp_count" : 52, "group" : "Austin-MongoDB-User-Group", "year" : 2016 }

{ "event_count" : 1, "rsvp_count" : 8, "group" : "Atlanta-MongoDB-User-Group", "year" : 2018 }

Type "it" for more

MongoDB also has a mapReduce function. The Compass GUI has an aggregation pipeline builder that makes creating queries such as the one above fairly straightforward.

MongoDB supports a range of server data consistency levels starting with read uncommitted and going to causal. Causal consistency was only added in version 3.6, and is also supported in client sessions. The client sets read and write concerns to specify the desired consistency level.

In MongoDB ist eine Schreiboperation auf der Ebene eines einzelnen Dokuments atomar, selbst wenn die Operation mehrere eingebettete Dokumente in einem einzelnen Dokument ändert. Wenn eine einzelne Schreiboperation (z. B. db.collection.updateMany()) mehrere Dokumente ändert, ist die Änderung jedes Dokuments atomar, aber die Operation als Ganzes ist nicht atomar. Ab Version 4.0 bietet MongoDB in Situationen, in denen Aktualisierungen für mehrere Dokumente oder Konsistenz zwischen Lesevorgängen für mehrere Dokumente erforderlich sind, Transaktionen mit mehreren Dokumenten für Replikatsätze zu Leistungskosten an.