MongoDB Konzeptanalyse

Egal, welche Datenbank wir lernen, sollten wir ihre grundlegenden Konzepte lernen. In MongoDB sind die grundlegenden Konzepte Dokumente, Collections und Datenbanken. Wir werden sie unten nacheinander vorstellen.

Die folgende Tabelle hilft Ihnen, einige Konzepte in MongoDB besser zu verstehen:

SQL-Begriffe/Konzepte MongoDB-Begriffe/Konzepte Erklärung/Beschreibung
Datenbank Datenbank Datenbank
table Collection Datenbanktabelle/Collection
row document Datensatzzeile/Dokument
column Feld Datenfeld/Feld
index index Index
Tabellen-Joins   Tabellen-Joins, von MongoDB nicht unterstützt
Primärschlüssel Primärschlüssel Primärschlüssel, MongoDB legt das Feld _id automatisch als Primärschlüssel fest

Anhand des Beispiels in der folgenden Abbildung können wir auch einige Konzepte in MongoDB intuitiver verstehen:

Vollständige Begriffsliste:

  • Dokument: Die grundlegende Dateneinheit von MongoDB, normalerweise eine JSON-ähnliche Struktur, die mehrere Datentypen enthalten kann.

  • Collection: Ähnlich wie eine Tabelle in einer relationalen Datenbank ist eine Collection ein Container für eine Gruppe von Dokumenten. In MongoDB müssen Dokumente in einer Collection kein festes Schema haben.

  • Datenbank: Eine MongoDB-Instanz, die eine oder mehrere Collections enthält.

  • BSON: Die Abkürzung für Binary JSON; es ist die binäre Form von JSON, die MongoDB zum Speichern und Übertragen von Dokumenten verwendet.

  • Index: Eine Datenstruktur zur Optimierung der Abfrageleistung. Indizes können basierend auf einem oder mehreren Feldern in einer Sammlung erstellt werden.

  • Sharding: Eine Methode zur Verteilung von Daten über mehrere Server (sogenannte Shards), um große Datensätze und Anwendungen mit hohem Durchsatz zu bewältigen.

  • Replica Set: Eine Gruppe von MongoDB-Servern, die denselben Datensatz verwalten und redundante Datensicherung sowie hohe Verfügbarkeit bieten.

  • Primary: Der Server in einem Replica Set, der für die Abwicklung aller Schreibvorgänge verantwortlich ist.

  • Secondary: Ein Server in einem Replica Set, der zum Lesen von Daten verwendet wird und als Primary übernimmt, wenn der Primary-Knoten ausfällt.

  • MongoDB Shell: Die von MongoDB bereitgestellte Befehlszeilenschnittstelle zur Interaktion mit MongoDB-Instanzen.

  • Aggregation Framework: Eine Folge von Operationen, die für komplexe Datenverarbeitung und Aggregation verwendet werden.

  • Map-Reduce: Ein Programmiermodell für parallele Berechnungen über große Datensätze.

  • GridFS: Eine Spezifikation zum Speichern und Abrufen von Dateien, die größer als die BSON-Dokumentgrößenbeschränkung sind.

  • ObjectId: Eine eindeutige Kennung, die von MongoDB automatisch für jedes Dokument generiert wird.

  • CRUD Operations: Operationen für Create, Read, Update und Delete.

  • Transactions: Unterstützt ab MongoDB 4.0, wodurch eine Gruppe von Operationen als atomare Einheit ausgeführt werden kann.

  • Operatoren: Spezielle Felder, die zum Abfragen und Aktualisieren von Dokumenten verwendet werden.

  • Join: MongoDB ermöglicht die Verwendung des$lookupOperators, um Join-Operationen ähnlich wie in SQL zu implementieren.

  • TTL(Time-To-Live): Sie können TTL für bestimmte Felder in einer Collection festlegen, um alte Daten automatisch zu löschen.

  • Speicher-Engine: Die zugrunde liegende Technologie, die MongoDB für Datenspeicherung und -verwaltung verwendet, wie WiredTiger und MongoDBs alte Speicher-Engine MMAPv1.

  • MongoDB Compass: MongoDBs grafisches Oberflächenwerkzeug zum Visualisieren und Verwalten von MongoDB-Daten.

  • MongoDB Atlas: Ein von MongoDB bereitgestellter Cloud-Dienst, der das Hosten von MongoDB-Datenbanken in der Cloud ermöglicht.


Datenbank

In einer MongoDB können mehrere Datenbanken erstellt werden.

Wenn während Operationen keine Datenbank angegeben wird, verwendet MongoDB eine Datenbank namenstestals Standarddatenbank, die im Datenverzeichnis gespeichert ist.

Eine einzelne Instanz von MongoDB kann mehrere unabhängige Datenbanken hosten, jede mit eigenen Collections und Berechtigungen. Unterschiedliche Datenbanken werden auch in unterschiedlichen Dateien abgelegt.

Ab MongoDB 4.0 werden Multi-Dokument-Transaktionen auf einer einzelnen Datenbank unterstützt.

"show dbs"Der Befehl kann eine Liste aller Datenbanken anzeigen.

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> show dbs
local  0.078GB
test   0.078GB
> 

Führen Sie"db"aus. Der Befehl kann das aktuelle Datenbankobjekt oder die aktuelle Sammlung anzeigen.

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
> 

Das Ausführen des Befehls "use" stellt eine Verbindung zu einer angegebenen Datenbank her.

> use local
switched to db local
> db
local
> 

Im obigen Beispielbefehl ist "local" die Datenbank, mit der Sie eine Verbindung herstellen möchten.

Im nächsten Kapitel werden wir die Verwendung von Befehlen in MongoDB im Detail erklären.

Datenbanken werden ebenfalls durch ihren Namen identifiziert. Ein Datenbankname kann jede UTF-8-Zeichenkette sein, die die folgenden Bedingungen erfüllt.

  • Darf keine leere Zeichenkette sein ("").
  • Darf kein ' ' (Leerzeichen), ., $, /, \, und \0 (Nullzeichen) enthalten.
  • Sollte durchgehend kleingeschrieben sein.
  • Höchstens 64 Bytes.

Einige Datenbanknamen sind reserviert und ermöglichen den direkten Zugriff auf diese speziellen Datenbanken.

  • admin: Aus Sicht der Berechtigungen ist dies die "root"-Datenbank. Wenn Sie dieser Datenbank einen Benutzer hinzufügen, erbt der Benutzer automatisch Berechtigungen für alle Datenbanken. Einige spezifische serverseitige Befehle können nur von dieser Datenbank aus ausgeführt werden, z. B. das Auflisten aller Datenbanken oder das Herunterfahren des Servers.
  • local:Diese Datenbank wird nie repliziert und kann verwendet werden, um beliebige Sammlungen zu speichern, die auf einen einzelnen lokalen Server beschränkt sind.
  • config: Wenn MongoDB in Sharding-Setups verwendet wird, wird die config-Datenbank intern verwendet, um sharding-bezogene Informationen zu speichern.

Dokumentation

Ein Dokument ist eine Menge von Schlüssel-Wert-Paaren (d. h. BSON). MongoDB-Dokumente müssen nicht dieselben Felder haben, und dieselben Felder müssen nicht dieselben Datentypen haben. Dies ist ein wesentlicher Unterschied zu relationalen Datenbanken und ein sehr hervorstechendes Merkmal von MongoDB.

Ein einfaches Beispiel für ein Dokument ist wie folgt:

{"site":"www.example.com", "name":"Example"}

Die folgende Tabelle listet die entsprechenden Begriffe zwischen RDBMS und MongoDB auf:

RDBMS MongoDB
Datenbank Datenbank
Tabelle Auflistung
line Dokumentation
Column Feld
Tabellen-Joins Eingebettetes Dokument
Primärschlüssel Primärschlüssel (MongoDB stellt den Schlüssel als _id bereit)
Datenbankserver und Client
Mysqld/Oracle mongodb
mysql/sqlplus mongo

Es ist zu beachten, dass:

  1. Die Schlüssel/Wert-Paare in einem Dokument sind geordnet.
  2. Werte in einem Dokument können nicht nur Zeichenketten in doppelten Anführungszeichen sein, sondern auch verschiedene andere Datentypen (sogar ein ganzes eingebettetes Dokument).
  3. MongoDB unterscheidet zwischen Typen und Groß-/Kleinschreibung.
  4. MongoDB-Dokumente können keine doppelten Schlüssel haben.
  5. Die Schlüssel eines Dokuments sind Zeichenketten. Bis auf wenige Ausnahmen können Schlüssel beliebige UTF-8-Zeichen verwenden.

Namenskonventionen für Dokumentschlüssel:

  • Schlüssel dürfen kein \0 (Nullzeichen) enthalten. Dieses Zeichen wird verwendet, um das Ende eines Schlüssels anzugeben.
  • . und $ haben spezielle Bedeutungen und können nur unter bestimmten Umständen verwendet werden.
  • Schlüssel, die mit einem Unterstrich "_" beginnen, sind reserviert (nicht zwingend erforderlich).

Auflistung

Eine Collection ist eine Gruppe von MongoDB-Dokumenten, ähnlich einer Tabelle in einem RDBMS (relationales Datenbankmanagementsystem).

Collections existieren in Datenbanken und haben keine feste Struktur. Das bedeutet, dass Sie Daten unterschiedlicher Formate und Typen in eine Collection einfügen können, aber unter normalen Umständen stehen die Daten, die wir in eine Collection einfügen, in einem gewissen Zusammenhang.

Zum Beispiel können wir Dokumente mit den folgenden unterschiedlichen Datenstrukturen in eine Collection einfügen:

{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.example.com","name":"Example","num":5}

Wenn das erste Dokument eingefügt wird, wird die Collection erstellt.

Gültige Collection-Namen

  • Ein Collection-Name darf keine leere Zeichenkette "" sein.
  • Ein Collection-Name darf das Zeichen \0 (Nullzeichen) nicht enthalten. Dieses Zeichen stellt das Ende des Collection-Namens dar.
  • Ein Collection-Name darf nicht mit "system." beginnen; dies ist ein Präfix, das für System-Collections reserviert ist.
  • Von Benutzern erstellte Collection-Namen dürfen keine reservierten Zeichen enthalten. Einige Treiber unterstützen die Aufnahme von $ in Collection-Namen, da einige systemgenerierte Collections dieses Zeichen enthalten. Sofern Sie nicht auf solche systemerstellten Collections zugreifen müssen, verwenden Sie niemals $ in Ihren Collection-Namen.

Das folgende Beispiel:

db.col.findOne()

Capped Collections

Capped Collections sind Collections mit fester Größe.

Sie bieten hohe Leistung und Eigenschaften einer Warteschlangen-Ablaufsteuerung (Ablauf in Einfügereihenfolge). Dies ist in gewisser Weise dem "RRD"-Konzept ähnlich.

Capped Collections sind leistungsstark und behalten automatisch die Einfügereihenfolge von Objekten bei. Sie eignen sich sehr gut für Funktionen wie Protokollierung. Im Gegensatz zu Standard-Collections müssen Sie eine Capped Collection explizit erstellen und die Größe der Collection in Bytes angeben. Der Datenspeicherplatz der Collection wird vorab zugewiesen.

Capped Collections können Dokumente in Einfügereihenfolge speichern, und ihre Positionen auf der Festplatte werden ebenfalls in Einfügereihenfolge gespeichert. Wenn wir daher Dokumente in einer Capped Collection aktualisieren, darf das aktualisierte Dokument die Größe des vorherigen Dokuments nicht überschreiten. Dadurch bleiben die Positionen aller Dokumente auf der Festplatte unverändert.

Da eine Capped Collection die Einfügeposition anhand der Dokument-Einfügereihenfolge und nicht anhand von Indizes bestimmt, kann dies die Effizienz beim Hinzufügen von Daten verbessern. Die Operationsprotokolldatei oplog.rs von MongoDB ist mit Capped Collections implementiert.

Beachten Sie, dass die angegebene Speichergröße die Header-Informationen der Datenbank enthält.

db.createCollection("mycoll", {capped:true, size:100000})
  • In einer Capped Collection können Sie neue Objekte hinzufügen.
  • Aktualisierungen sind möglich; Objekte vergrößern jedoch nicht den Speicherplatz. Falls doch, schlägt das Update fehl.
  • Bei einer Capped Collection können Sie ein Dokument nicht löschen. Sie können die drop()-Methode verwenden, um alle Zeilen in der Collection zu löschen.
  • Nach dem Löschen müssen Sie die Collection explizit neu erstellen.
  • Auf 32-Bit-Maschinen beträgt der maximale Speicher einer Capped Collection 1e9 (1X109) Bytes.

Metadaten

Datenbankinformationen werden in Collections gespeichert. Sie verwenden den System-Namespace:

dbname.system.*

In MongoDB ist der Namespace <dbname>.system.* eine spezielle Collection (Collection), die verschiedene Systeminformationen enthält, wie folgt:

Collection-Namespace Beschreibung
dbname.system.namespaces Alle Namespaces auflisten.
dbname.system.indexes Alle Indizes auflisten.
dbname.system.profile Enthält Datenbank-Profilinformationen.
dbname.system.users Alle Benutzer zugänglicher Datenbanken auflisten.
dbname.local.sources Enthält Serverinformationen und Status von Replikations-Peers (Slaves).

Es gibt die folgenden Einschränkungen beim Ändern von Objekten in System-Collections.

Das Einfügen von Daten in {{system.indexes}} kann einen Index erstellen. Aber abgesehen davon sind die Informationen in dieser Tabelle unveränderlich (der spezielle drop index-Befehl aktualisiert automatisch zugehörige Informationen).

{{system.users}} ist änderbar. {{system.profile}} ist löschbar.


MongoDB-Datentypen

Die folgende Tabelle listet einige häufig verwendete Datentypen in MongoDB auf.

Datentyp Beschreibung
StringString. Ein häufiger Datentyp zum Speichern von Daten. In MongoDB sind nur UTF-8-kodierte Zeichenfolgen gültig.
IntegerInteger. Wird zum Speichern numerischer Werte verwendet. Je nach verwendetem Server kann er 32-Bit oder 64-Bit sein.
BooleanBoolean. Wird zum Speichern boolescher Werte (true/false) verwendet.
DoubleDouble. Wird zum Speichern von Gleitkommawerten verwendet.
Min/Max-SchlüsselVergleicht einen Wert mit dem niedrigsten und höchsten Wert von BSON-Elementen (Binary JSON).
ArrayWird verwendet, um ein Array, eine Liste oder mehrere Werte unter einem Schlüssel zu speichern.
ZeitstempelTimestamp. Erfasst den genauen Zeitpunkt, zu dem ein Dokument geändert oder hinzugefügt wird.
ObjektWird für eingebettete Dokumente verwendet.
NullWird verwendet, um einen Nullwert zu erstellen.
SymbolSymbol. Dieser Datentyp entspricht im Wesentlichen dem String-Typ, der Unterschied besteht jedoch darin, dass er im Allgemeinen in Sprachen verwendet wird, die einen speziellen Symboltyp verwenden.
DateDate. Speichert das aktuelle Datum oder die aktuelle Uhrzeit im UNIX-Zeitformat. Sie können Ihr eigenes Datum und Ihre eigene Uhrzeit angeben: Erstellen Sie ein Date-Objekt und übergeben Sie Jahr, Monat und Tag.
Objekt-IDObjekt-ID. Wird verwendet, um die ID eines Dokuments zu erstellen.
BinärdatenBinärdaten. Wird zum Speichern von Binärdaten verwendet.
CodeCode-Typ. Wird verwendet, um JavaScript-Code in einem Dokument zu speichern.
Regulärer AusdruckTyp für reguläre Ausdrücke. Wird zum Speichern regulärer Ausdrücke verwendet.

Im Folgenden werden mehrere wichtige Datentypen erläutert.

ObjectId

ObjectId ähnelt einem eindeutigen Primärschlüssel; es kann schnell generiert und sortiert werden. Es enthält 12 Bytes, was bedeutet:

  • Die ersten 4 Bytes repräsentieren den ErstellungsUnix-Zeitstempel, Greenwich Mean TimeUTC-Zeit, 8 Stunden hinter der Peking-Zeit
  • Die nächsten 3 Bytes sind der Maschinenkennungscode
  • Die nächsten zwei Bytes bestehen aus der Prozess-ID (PID)
  • Die letzten drei Bytes sind eine Zufallszahl

In MongoDB gespeicherte Dokumente müssen einen _id-Schlüssel haben. Der Wert dieses Schlüssels kann von jedem Typ sein; standardmäßig ist er ein ObjectId-Objekt.

Da die ObjectId den Erstellungszeitstempel enthält, müssen Sie kein Zeitstempelfeld für Ihr Dokument speichern. Sie können die getTimestamp-Funktion verwenden, um die Erstellungszeit des Dokuments abzurufen:

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")

ObjectId in String umwandeln

> newObject.str
5a1919e63df83ce79df8b38f

String

BSON-Strings sind UTF-8-codiert.

Zeitstempel

BSON hat einen speziellen Timestamp-Typ, der intern von MongoDB verwendet wird und nicht mit dem gewöhnlichen Date-Typ zusammenhängt. Ein Timestamp-Wert ist ein 64-Bit-Wert. Dabei:

  • Die ersten 32 Bits sind ein time_t-Wert (die Anzahl der Sekunden seit der Unix-Epoche)
  • Die letzten 32 Bits sind eine inkrementierende Ordnungszahl für Operationen innerhalb einer gegebenen SekundeOrdinal number

In einer einzelnen mongod-Instanz sind Timestamp-Werte normalerweise eindeutig.

In einem Replica Set besitzt das Oplog ein ts-Feld. Der Wert in diesem Feld verwendet einen BSON-Timestamp, um die Operationszeit darzustellen.

Der BSON-Timestamp-Typ wird hauptsächlich intern von MongoDB verwendet. In den meisten Situationen der Anwendungsentwicklung können Sie den BSON-Datumstyp verwenden.

Date

Stellt die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970) dar. Der Datumstyp ist vorzeichenbehaftet; negative Zahlen stellen Daten vor 1970 dar.

> var mydate1 = new Date()     //格林尼治时间
> mydate1
ISODate("2018-03-04T14:58:51.233Z")
> typeof mydate1
object
> var mydate2 = ISODate() //格林尼治时间
> mydate2
ISODate("2018-03-04T15:00:45.479Z")
> typeof mydate2
object

Die so erzeugte Zeit ist vom Datumstyp, und Sie können die Methoden des Date-Typs in JS verwenden.

Gibt eine Zeichenkette vom Zeittyp zurück:

> var mydate1str = mydate1.toString()
> mydate1str
Sun Mar 04 2018 14:58:51 GMT+0000 (UTC) 
> typeof mydate1str
string

oder

> Date()
Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)   
Weitere Erweiterungen