14 Dinge, die ich gerne gewusst hätte, bevor ich mit MongoDB anfing

Die Übersetzung des Artikels wurde im Vorfeld des Starts des Kurses vorbereitet Nicht-relationale Datenbanken.

14 Dinge, die ich gerne gewusst hätte, bevor ich mit MongoDB anfing

Hauptpunkte:

  • Es ist äußerst wichtig, ein Schema zu entwickeln, auch wenn es in MongoDB nicht zwingend erforderlich ist.
  • Ähnlich sollten Indizes mit Ihrem Schema und den Zugriffsmodellen übereinstimmen.
  • Vermeiden Sie die Verwendung von großen Objekten und großen Arrays.
  • Seien Sie vorsichtig mit den Einstellungen von MongoDB, insbesondere im Hinblick auf Sicherheit und Zuverlässigkeit.
  • MongoDB hat keinen Abfrageoptimierer, daher sollten Sie beim Ausführen von Abfragen vorsichtig sein.

Ich arbeite schon lange mit Datenbanken, habe aber erst kürzlich MongoDB entdeckt. Es gibt einige Dinge, die ich wissen wollte, bevor ich damit anfange. Wenn man bereits Erfahrung in einem bestimmten Bereich hat, hat man eine vorgefasste Meinung darüber, was Datenbanken sind und was sie tun. Um anderen das Verständnis zu erleichtern, präsentiere ich eine Liste häufiger Fehler.

Einen MongoDB-Server ohne Authentifizierung zu erstellen

Leider wird MongoDB standardmäßig ohne Authentifizierung eingerichtet. Für eine Arbeitsstation, die lokal zugänglich ist, ist diese Praxis normal. Da MongoDB jedoch ein Mehrbenutzersystem ist, das große Mengen an Speicher benötigt, wäre es besser, es auf einem Server mit maximal möglichem Arbeitsspeicher auszuführen, selbst wenn Sie es nur für die Entwicklung verwenden. Die Installation auf einem Server über den Standardport kann problematisch sein, insbesondere wenn im Abfragecode beliebiger JavaScript durchgeführt werden kann (zum Beispiel $where als Idee für Injektion).

Es gibt mehrere Authentifizierungsmethoden, aber am einfachsten ist es, einen Benutzer-ID/Passwort zu erstellen. Nutzen Sie diese Idee, während Sie über eine ausgefallene Authentifizierung auf Basis von LDAPnachdenken. Was die Sicherheit betrifft, so sollte MongoDB ständig aktualisiert werden, und die Protokolle sollten immer auf unbefugten Zugriff überprüft werden. Mir persönlich gefällt es, einen anderen Port als den Standardport auszuwählen.

Vergessen Sie nicht, die Angriffsfläche an MongoDB zu binden

Checkliste zur Sicherstellung der Sicherheit von MongoDB enthält gute Ratschläge zur Verringerung des Risikos eines Eindringens in das Netzwerk und des Datenlecks. Es ist leicht zu sagen, dass ein Entwicklungsserver kein hohes Sicherheitsniveau benötigt. Aber so einfach ist es nicht, und das gilt für alle MongoDB-Server. Insbesondere wenn es keinen triftigen Grund gibt, zu verwenden mapReduce, Gruppe oder $where, sollte die Verwendung von beliebigem JavaScript-Code in der Konfigurationsdatei deaktiviert werden javascriptEnabled:false. Da in der standardmäßigen MongoDB die Datendateien nicht verschlüsselt sind, ist es sinnvoll, MongoDB mit Dedicated Userzu starten, der vollständigen Zugriff auf die Dateien hat, jedoch nur eingeschränkten Zugriff darauf und die Möglichkeit, eigene Mittel zur Zugriffskontrolle auf die Dateien des Betriebssystems zu verwenden.

Fehler bei der Schema-Entwicklung

MongoDB verwendet kein Schema. Aber das bedeutet nicht, dass ein Schema nicht nötig ist. Wenn Sie einfach nur Dokumente ohne ein konsistentes Schema speichern möchten, können Sie dies schnell und einfach tun, aber das Abrufen der Daten kann dann höchst schwierig.

Der klassische Artikel „6 empirische Regeln für das Design von MongoDB-Schemas“ ist lesenswert, und Funktionen wie Schema Explorer in dem Drittanbieter-Tool Studio 3T sollten regelmäßig zur Überprüfung der Schemata verwendet werden.

Vergessen Sie nicht die Sortierreihenfolge

Die Vergesslichkeit bezüglich der Sortierreihenfolge kann frustrierender sein und mehr Zeit kosten als die Verwendung einer anderen falschen Konfiguration. Standardmäßig verwendet MongoBD binäre Sortierung. Aber das wird wahrscheinlich niemandem helfen. Fall-sensitive, akzent-sensitive, binäre Sortierungen galten neben Perlen, Kaftanen und gewundenen Schnurrbärten schon in den 80er Jahren des letzten Jahrhunderts als merkwürdige Anachronismen. Heute ist ihre Verwendung unverzeihlich. Im realen Leben ist „Motorrad“ dasselbe wie „Motorrad“. Und „Britannien“ und „britannien“ sind dasselbe Gebiet. Ein Kleinbuchstabe ist einfach das großgeschriebene Äquivalent eines Großbuchstabens. Und lassen Sie mich nicht über die Sortierung diakritischer Zeichen sprechen. Bei der Erstellung einer Datenbank in MongoDB verwenden Sie Sortierparameter, die keine Akzent- und Groß- und Kleinschreibung, die der Sprache und der Kultur der Benutzer des Systems entsprechen. So vereinfachen Sie die Suche nach Zeichenfolgendaten erheblich.

Erstellen von Sammlungen mit großen Dokumenten

MongoDB freut sich, große Dokumente von bis zu 16 MB in Sammlungen zu speichern, GridFS die für große Dokumente über 16 MB vorgesehen ist. Aber nur weil große Dokumente dort gespeichert werden können, ist es nicht die beste Idee, sie dort aufzubewahren. MongoDB funktioniert am besten, wenn Sie separate Dokumente von mehreren Kilobyte speichern und diese mehr wie Zeilen in einer breiten SQL-Tabelle betrachten. Große Dokumente können Leistungsprobleme verursachen. Leistung.

Das Erstellen von Dokumenten mit großen Arrays

Dokumente können Arrays enthalten. Am besten ist es, wenn die Anzahl der Elemente im Array weit entfernt von einer vierstelligen Zahl ist. Wenn regelmäßig Elemente zum Array hinzugefügt werden, wird es das dokumentierende Dokument übersteigen und es muss verschoben werden,was bedeutet, dass auch die Indizes aktualisiert werden müssen.Bei der erneuten Indizierung eines Dokuments mit einem großen Array werden die Indizes häufig überschrieben, da für jedes Element eine Aufzeichnungvorhanden ist, die seinen Index speichert. Eine solche Neuindizierung findet auch statt, wenn ein Dokument eingefügt oder gelöscht wird.

In MongoDB gibt es den sogenannten „Füllfaktor“, der Platz für das Wachstum von Dokumenten bereitstellt, um dieses Problem zu minimieren.
Sie könnten denken, dass man auf die Indizierung von Arrays verzichten kann. Leider können Sie aufgrund fehlender Indizes auf andere Probleme stoßen. Da Dokumente von Anfang bis Ende durchsucht werden, wird die Suche nach Elementen am Ende des Arrays mehr Zeit in Anspruch nehmen, und die meisten damit verbundenen Operationen mit einem solchen Dokument werden langsam sein..

Vergessen Sie nicht, dass die Reihenfolge der Schritte in der Aggregation von Bedeutung ist.

In einem Datenbanksystem mit einem Abfrageoptimierer sind die Abfragen, die Sie schreiben, Erklärungen dafür, was Sie erhalten möchten, und nicht dafür, wie es erreicht werden soll. Dieses System funktioniert ähnlich wie eine Bestellung im Restaurant: Normalerweise bestellen Sie einfach ein Gericht, anstatt dem Koch detaillierte Anweisungen zu geben.

In MongoDB instruieren Sie den Koch. Zum Beispiel sollten Sie sicherstellen, dass die Daten so früh wie möglich im Pipeline durch reduce mit Hilfe von $match und $project, während die Sortierung erst danach erfolgt. reduce, und dass die Suche genau in der Reihenfolge erfolgt, in der Sie es benötigen. Ein Abfrageoptimierer, der unnötige Arbeit vermeidet, die Schritte optimal anordnet und den Verbindungstyp auswählt, kann Sie verwöhnen. In MongoDB haben Sie mehr Kontrolle, als es die Bequemlichkeit zulässt.

Werkzeuge wie Studio 3T vereinfachen den Aufbau von Aggregationsanfragen in MongoDB. Die Funktion Aggregation Editor ermöglicht es Ihnen, Pipeline-Operatoren schrittweise anzuwenden sowie Eingangs- und Ausgangsdaten in jedem Schritt zur Vereinfachung des Debuggens zu überprüfen.

Die Verwendung von schneller Aufzeichnung

Setzen Sie in MongoDB niemals Aufzeichnungsparameter mit hoher Geschwindigkeit, aber niedriger Zuverlässigkeit. Dieser Modus «file-and-forget» scheint schnell zu sein, da der Befehl zurückkehrt, bevor die Aufzeichnung erfolgt. Fällt das System aus, bevor die Daten auf die Festplatte geschrieben werden, gehen sie verloren und befinden sich in einem inkonsistenten Zustand. Glücklicherweise ist in MongoDB mit 64-Bit Protokollierung aktiviert.

Die Speicher-Engines MMAPv1 und WiredTiger verwenden Protokollierung, um dies zu verhindern, obwohl WiredTiger sich bis zum letzten konsistenten Kontrollpunkt, wenn die Protokollierung deaktiviert ist.

Die Protokollierung gewährleistet, dass die Datenbank nach der Wiederherstellung in einem konsistenten Zustand ist und alle Daten bis zum Protokollierungspunkt aufbewahrt werden. Die Häufigkeit der Aufzeichnungen wird durch den Parameter eingestellt CommitIntervalMs.

Um sicherzustellen, dass Aufzeichnungen erfolgen, stellen Sie sicher, dass in der Konfigurationsdatei die Protokollierung aktiviert ist (speicher.journal.aktiviert), und dass die Häufigkeit der Aufzeichnungen dem Umfang der Informationen entspricht, die Sie sich leisten können zu verlieren.

Sortierung ohne Index

Bei der Suche und Aggregation wird häufig eine Sortierung der Daten erforderlich. Hoffen wir, dass dies in einem der letzten Schritte erfolgt, nachdem das Ergebnis gefiltert wurde, um das Volumen der zu sortierenden Daten zu verringern. Selbst in diesem Fall benötigen Sie für die Sortierung Index. Sie können einen Einzel- oder zusammengesetzten Index verwenden.

Wenn kein geeigneter Index vorhanden ist, kommt MongoDB ohne ihn aus. Es gibt eine Speichergrenze von 32 MB für die Gesamtgröße aller Dokumente in der Sortieroperation, und wenn MongoDB dieses Limit erreicht, gibt es entweder einen Fehler aus oder gibt ein leeres Ergebnis zurück..

Suche ohne Unterstützung von Indizes

Suchanfragen erfüllen eine Funktion, die der JOIN-Operation in SQL ähnelt. Für eine bessere Leistung benötigen sie einen Index des Wertes des Schlüssels, der als Fremdschlüssel verwendet wird. Dies ist nicht offensichtlich, da die Nutzung nicht widergespiegelt wird in explain(). Solche Indizes sind eine Ergänzung zum Index, der in explain(), der wiederum von den Pipeline-Operatoren verwendet wird, $match und $sort, wenn diese am Anfang der Pipeline auftreten. Indizes können jetzt jede Phase der Aggregationspipeline abdecken..

Der Verzicht auf die Verwendung von Multi-Updates

Methode db.collection.update() wird verwendet, um einen Teil eines bestehenden Dokuments oder das gesamte Dokument zu ändern, bis hin zur vollständigen Ersetzung, je nach dem von Ihnen angegebenen Parameter. updateEs ist nicht so offensichtlich, dass er nicht alle Dokumente in der Sammlung verarbeitet, es sei denn, Sie setzen den Parameter mehrere um alle Dokumente zu aktualisieren, die den Abfragekriterien entsprechen.

Vergessen Sie nicht die Bedeutung der Reihenfolge der Schlüssel in der Hashtabelle.

In JSON besteht ein Objekt aus einer ungeordneten Sammlung von null oder mehr Schlüssel/Wert-Paaren, wobei der Schlüssel eine Zeichenkette ist und der Wert eine Zeichenkette, Zahl, boolescher Wert, null, Objekt oder Array sein kann.

Leider legt BSON großen Wert auf die Reihenfolge bei Suchvorgängen. In MongoDB hat die Reihenfolge der Schlüssel innerhalb von eingebetteten Objekten Bedeutung., d.h. { firstname: "Phil", surname: "factor" } ist nicht dasselbe wie { { surname: "factor", firstname: "Phil" }. Das heißt, Sie müssen die Reihenfolge der Schlüssel/Wert-Paare in den Dokumenten beibehalten, wenn Sie sicher sein wollen, dass Sie sie finden.

Verwechseln Sie nicht "null" und "undefined"

Wert "undefined" waren noch nie in JSON zulässig, gemäß dem offiziellen Standard. JSON (ECMA-404, Abschnitt 5), obwohl es in JavaScript verwendet wird. Darüber hinaus ist es für BSON veraltet und wird in $null, was nicht immer eine gute Lösung ist. Vermeiden Sie die Nutzung von "undefined" in MongoDB..

Verwendung $limit() ohne $sort()

Oft, wenn Sie in MongoDB entwickeln, ist es nützlich, einfach ein Beispiel für das Ergebnis zu sehen, das aus einer Abfrage oder Aggregation zurückkommt. Für diese Aufgabe benötigen Sie $limit(), aber es sollte niemals in der endgültigen Version des Codes vorhanden sein, es sei denn, Sie verwenden es davor. $sort. Diese Mechanik ist notwendig, da Sie sonst die Reihenfolge des Ergebnisses nicht garantieren können und die Daten nicht zuverlässig durchsuchen können. Oben im Ergebnis erhalten Sie je nach Sortierung unterschiedliche Einträge. Für eine zuverlässige Funktion müssen Anfragen und Aggregationen determiniert sein, d.h. bei jedem Ausführen die gleichen Ergebnisse liefern. Der Code, der enthalten ist $limit(), aber nicht $sort, wird nicht determiniert sein und kann später zu Fehlern führen, die schwer nachzuvollziehen sind.

Fazit

Der einzige Weg, sich über MongoDB zu enttäuschen, ist, sie direkt mit einem anderen Datenbanktyp, wie z.B. RDBMS, zu vergleichen oder sie mit bestimmten Erwartungen zu verwenden. Das ist so, als würde man eine Orange mit einer Gabel vergleichen. Datenbanksysteme verfolgen bestimmte Ziele. Am besten ist es, einfach diese Unterschiede zu verstehen und zu schätzen. Es wäre schade, Druck auf die Entwickler von MongoDB auszuüben, weil sie gezwungen waren, den Weg eines RDBMS zu gehen. Ich möchte neue und interessante Wege sehen, um alte Probleme zu lösen, wie z.B. die Sicherstellung der Datenintegrität und die Schaffung von datensicheren Systemen, die gegen Ausfälle und Angriffe von Angreifern widerstandsfähig sind.

Die Einführung von ACID-Transaktionen in MongoDB in Version 4.0 ist ein gutes Beispiel für die innovative Implementierung wichtiger Verbesserungen. Mehrdokument- und Mehroperatortransaktionen sind jetzt atomar. Es gibt auch die Möglichkeit, die Zeit zu steuern, die benötigt wird, um Sperren zu erhalten, und hängende Transaktionen zu beenden sowie das Isolationsniveau zu ändern.

14 Dinge, die ich gerne gewusst hätte, bevor ich mit MongoDB anfing

Weiterlesen:

Quelle: habr.com

60GB SSD 8Gb DDR4