Highlights:
- Es ist äußerst wichtig, das Schema zu entwerfen, obwohl es in MongoDB optional ist.
- Ebenso müssen Indizes mit Ihrem Schema und den Zugriffsmustern übereinstimmen.
- Vermeiden Sie die Verwendung großer Objekte und großer Arrays.
- Seien Sie vorsichtig mit den MongoDB-Einstellungen, insbesondere wenn es um Sicherheit und Zuverlässigkeit geht.
- MongoDB verfügt nicht über ein Abfrageoptimierungsprogramm, daher müssen Sie bei der Ausführung von Abfragevorgängen vorsichtig sein.
Ich habe sehr lange mit Datenbanken gearbeitet, aber erst kürzlich MongoDB entdeckt. Es gibt ein paar Dinge, die ich gerne wissen würde, bevor ich damit anfange. Wenn eine Person bereits Erfahrung in einem bestimmten Bereich hat, hat sie vorgefasste Vorstellungen darüber, was Datenbanken sind und was sie tun. In der Hoffnung, anderen das Verständnis zu erleichtern, finden Sie hier eine Liste häufiger Fehler.
MongoDB-Server ohne Authentifizierung erstellen
Leider wird MongoDB standardmäßig ohne Authentifizierung installiert. Es ist normal, dass lokal auf eine Workstation zugegriffen wird. Da MongoDB ein Mehrbenutzersystem ist, das gerne große Speichermengen verwendet, ist es am besten, wenn Sie es auf einen Server mit möglichst viel RAM stellen, auch wenn Sie es nur für die Entwicklung verwenden. Die Installation auf dem Server über den Standardport kann problematisch sein, insbesondere wenn in der Anforderung Javascript-Code ausgeführt werden kann (z. B.
$whereals Idee für eine Injektion ).
Es gibt verschiedene Authentifizierungsmethoden. Am einfachsten ist es jedoch, eine Benutzer-ID / ein Kennwort festzulegen. Nehmen Sie diese Idee, während Sie über eine ausgefallene LDAP- basierte Authentifizierung nachdenken . Wenn es um Sicherheit geht, muss MongoDB ständig aktualisiert werden und die Protokolle sollten immer auf unbefugten Zugriff überprüft werden. Zum Beispiel möchte ich einen anderen Port als Standardport auswählen.
Denken Sie daran, die Angriffsfläche an MongoDB zu binden
Die MongoDB-Sicherheitscheckliste enthält gute Tipps, um das Risiko von Netzwerkeinbrüchen und Datenlecks zu verringern. Es ist einfach, es zu verwerfen und zu sagen, dass ein Entwicklungsserver kein hohes Maß an Sicherheit benötigt. Die Dinge sind jedoch nicht so einfach und dies gilt für alle MongoDB-Server. Insbesondere wäre denn , es ist ein zwingender Grund zu verwenden
mapReduce, groupoder $ , wo Sie die Verwendung von beliebigem JavaScript - Code , indem er in der Konfigurationsdatei deaktivieren sollten javascriptEnabled:false. Da Datendateien in der Standard-MongoDB nicht verschlüsselt sind, ist es sinnvoll, MongoDB mit einem dedizierten Benutzer auszuführen, der über vollständigen Dateizugriff verfügt, nur über eingeschränkten Zugriff auf ihn verfügt und die betriebssystemeigenen Dateizugriffskontrollen verwenden kann.
Schaltungsentwurfsfehler
MongoDB verwendet kein Schema. Dies bedeutet jedoch nicht, dass die Schaltung nicht benötigt wird. Wenn Sie nur Dokumente ohne einheitliches Layout speichern möchten, kann das Speichern schnell und einfach erfolgen, das spätere Abrufen kann jedoch verdammt schwierig sein .
Der klassische Artikel „ 6 Faustregeln für das MongoDB-Schemadesign“ ist lesenswert, während Funktionen wie der Schema-Explorer im Drittanbieter-Tool von Studio 3T für die regelmäßige Schemaüberprüfung verwendet werden sollten.
Vergessen Sie nicht die Sortierreihenfolge
Das Vergessen der Sortierreihenfolge kann die frustrierendste und verschwenderischste aller anderen Fehlkonfigurationen sein. MongoBD verwendet standardmäßig die binäre Sortierung . Aber es ist unwahrscheinlich, dass es für irgendjemanden nützlich sein wird. In den 80er Jahren des letzten Jahrhunderts galten case-sensitive, stress-sensitive, binäre Sorten als merkwürdige Anachronismen zusammen mit Perlen, Kaftanen und lockigen Schnurrbärten. Jetzt ist ihre Verwendung unverzeihlich. Im wirklichen Leben ist "Motorrad" dasselbe wie "Motorrad". Und "Großbritannien" und "Großbritannien" sind ein und derselbe Ort. Ein Kleinbuchstabe ist einfach das Äquivalent eines Großbuchstabens in Großbuchstaben. Und lass mich nicht über diakritisches Sortieren sprechen. Verwenden Sie beim Erstellen einer Datenbank in MongoDB die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibungdas entspricht der Sprache und Kultur der Benutzer des Systems . Dies vereinfacht die Suche nach Zeichenfolgendaten erheblich.
Erstellen von Sammlungen mit großen Dokumenten
MongoDB hostet gerne große Dokumente mit einer Größe von bis zu 16 MB in Sammlungen, und GridFS wurde für große Dokumente mit mehr als 16 MB entwickelt. Aber nur weil große Dokumente dort abgelegt werden können, ist es keine gute Idee, sie dort aufzubewahren. MongoDB funktioniert am besten, wenn Sie einzelne Dokumente mit einer Größe von mehreren Kilobyte speichern und sie eher wie Zeilen in einer breiten SQL-Tabelle behandeln. Große Dokumente verursachen Leistungsprobleme .
Erstellen Sie Dokumente mit großen Arrays
Dokumente können Arrays enthalten. Es ist am besten, wenn die Anzahl der Elemente im Array weit von der vierstelligen Anzahl entfernt ist. Wenn dem Array häufig Elemente hinzugefügt werden, wächst es aus dem Dokument heraus, das es enthält, und es muss verschoben werden , was bedeutet, dass die Indizes aktualisiert werden müssen . Bei der Neuindizierung eines Dokuments mit einem großen Array werden die Indizes häufig überschrieben, da für jedes Element ein Eintrag vorhanden ist, in dem sein Index gespeichert ist. Diese Neuindizierung erfolgt auch, wenn ein Dokument eingefügt oder gelöscht wird.
MongoDB verfügt über einen sogenannten "Füllfaktor" , der Platz für das Wachstum von Dokumenten bietet, um dieses Problem zu minimieren.
Sie könnten denken, dass Sie ohne Indizierung der Arrays auskommen können. Leider können aufgrund des Mangels an Indizes andere Probleme auftreten. Da Dokumente von Anfang bis Ende gescannt werden, dauert es länger, Elemente am Ende des Arrays zu finden, und die meisten mit einem solchen Dokument verbundenen Vorgänge sind langsam .
Vergessen Sie nicht die Reihenfolge der Stufen in der Aggregation
In einem Datenbanksystem mit einem Abfrageoptimierer sind die Abfragen, die Sie schreiben, Erklärungen dessen, was Sie erhalten möchten, und nicht, wie Sie es erhalten. Dieser Mechanismus funktioniert analog zur Bestellung in einem Restaurant: Normalerweise bestellen Sie nur ein Gericht und geben dem Küchenchef keine detaillierten Anweisungen.
In MongoDB weisen Sie den Koch an. Beispielsweise müssen Sie sicherstellen, dass Daten
reducemit $matchund so früh wie möglich in der Pipeline durchlaufen werden $projectund die Sortierung erst danach reduceerfolgt und dass die Suche genau in der Reihenfolge erfolgt, in der Sie sie benötigen. Ein Abfrageoptimierer, der unnötige Arbeit eliminiert, die Phasen optimal organisiert und die Art der Verbindung auswählt, kann Sie verwöhnen. In MongoDB haben Sie mehr Kontrolle auf Kosten der Bequemlichkeit.
Werkzeuge wieMit Studio 3T können Sie auf einfache Weise Aggregationsabfragen in MongoDB erstellen . Mit dem Aggregationseditor können Sie Pipeline-Anweisungen Schritt für Schritt anwenden und die Eingabe- und Ausgabedaten bei jedem Schritt überprüfen, um das Debuggen zu vereinfachen.
Verwenden der Schnellaufnahme
Stellen Sie niemals MongoDB-Schreibparameter mit hoher Geschwindigkeit, aber geringer Zuverlässigkeit ein. Dieser "Datei-und-Vergessen" -Modus scheint schnell zu sein, da der Befehl vor dem Schreiben zurückgegeben wird. Wenn das System abstürzt, bevor die Daten auf die Festplatte geschrieben werden, gehen sie verloren und befinden sich in einem inkonsistenten Zustand. Glücklicherweise ist in der 64-Bit-MongoDB die Protokollierung aktiviert.
Die Speicher-Engines MMAPv1 und WiredTiger verwenden die Protokollierung, um dies zu verhindern. WiredTiger kann jedoch den zuletzt übereinstimmenden Prüfpunkt wiederherstellen, wenn die Protokollierung deaktiviert ist.
Durch das Journaling wird sichergestellt, dass sich die Datenbank nach der Wiederherstellung in einem konsistenten Zustand befindet, und alle Daten bleiben erhalten, bis sie protokolliert werden. Die Häufigkeit der Einträge wird mit dem Parameter konfiguriert
commitIntervalMs.
Stellen Sie zur Sicherstellung der Datensätze sicher, dass die Protokollierung in der Konfigurationsdatei aktiviert ist
(storage.journal.enabled)und dass die Häufigkeit der Datensätze der Menge an Informationen entspricht, die Sie sich leisten können, zu verlieren.
Sortieren ohne Index
Beim Suchen und Aggregieren ist es häufig erforderlich, die Daten zu sortieren. Hoffentlich erfolgt dies in einer der letzten Phasen nach dem Filtern des Ergebnisses, um die zu sortierende Datenmenge zu reduzieren. Trotzdem benötigen Sie einen Index zum Sortieren . Sie können einen einzelnen oder mehrere Indizes verwenden.
Wenn es keinen geeigneten Index gibt, wird MongoDB darauf verzichten. Es gibt eine 32 MB - Speicher Obergrenze für die Gesamtgröße aller Dokumente in einem Sortiervorgang , und wenn MongoDB diese Grenze erreicht, wird es entweder einen Fehler melden oder zurückgeben einen leeren Re - Cord .
Suche ohne Indexunterstützung
Suchabfragen führen eine ähnliche Funktion wie die JOIN-Operation in SQL aus. Für die beste Leistung benötigen sie den Index des als Fremdschlüssel verwendeten Schlüsselwerts. Dies ist nicht offensichtlich, da sich die Verwendung nicht in der widerspiegelt
explain(). Solche Indizes werden zusätzlich zu dem eingeschriebenen Index verwendet explain(), der wiederum von den Pipeline-Betreibern verwendet wird $matchund $sortwenn sie am Anfang der Pipeline auftreten. Indizes können jetzt jede Phase der Aggregationspipeline abdecken .
Deaktivieren Sie die Verwendung von Multi-Update
Die Methode wird
db.collection.update()verwendet, um einen Teil eines vorhandenen Dokuments oder ein ganzes Dokument bis zu einer vollständigen Ersetzung zu ändern, abhängig von dem von Ihnen angegebenen Parameter update. Es ist nicht so offensichtlich, dass nicht alle Dokumente in der Sammlung verarbeitet werden, bis Sie die Option multizum Aktualisieren aller Dokumente festlegen , die die Abfragekriterien erfüllen.
Vergessen Sie nicht, wie wichtig die Reihenfolge der Schlüssel in der Hash-Tabelle ist
In JSON besteht ein Objekt aus einer ungeordneten Sammlung von null oder mehr Name / Wert-Paaren, wobei name eine Zeichenfolge und value eine Zeichenfolge, eine Zahl, ein Boolescher Wert, eine Null, ein Objekt oder ein Array ist.
Leider legt BSON bei der Suche großen Wert auf die Bestellung. In MongoDB, innerhalb inline die Reihenfolge der Tasten Objekte Angelegenheit , das heißt
{ firstname: "Phil", surname: "factor" }Ist nicht dasselbe wie { { surname: "factor", firstname: "Phil" }. Das heißt, Sie müssen die Reihenfolge der Name / Wert-Paare in Ihren Dokumenten beibehalten, wenn Sie sicher sein möchten, dass Sie sie finden.
Verwechseln Sie nicht "null" und "undefiniert"
Der Wert "undefiniert" war in JSON gemäß dem offiziellen JSON- Standard (ECMA-404, Abschnitt 5) nie gültig , obwohl er in JavaScript verwendet wird. Darüber hinaus ist es für BSON veraltet und wird in konvertiert
$null, was nicht immer eine gute Lösung ist. Vermeiden Sie die Verwendung von "undefined" in MongoDB .
Verwenden Sie $limit()ohne$sort()
Sehr oft ist es bei der Entwicklung in MongoDB hilfreich, nur ein Beispiel des Ergebnisses anzuzeigen, das von einer Abfrage oder Aggregation zurückgegeben wird. Es ist nützlich für diese Aufgabe
$limit(), sollte jedoch niemals in der endgültigen Version des Codes enthalten sein, es sei denn, Sie verwenden es davor $sort. Dieser Mechanismus wird benötigt, da Sie sonst die Reihenfolge des Ergebnisses nicht garantieren und die Daten nicht zuverlässig anzeigen können. Oben im Ergebnis erhalten Sie je nach Sortierung unterschiedliche Datensätze. Um zuverlässig zu arbeiten, müssen Abfragen und Aggregationen deterministisch sein, dh bei jeder Ausführung dieselben Ergebnisse erzielen. Code, der zwar nicht deterministisch ist $limit(), aber nicht $sort, kann zu Fehlern führen, die nur schwer aufzuspüren sind.
Fazit
Die einzige Möglichkeit, mit MongoDB frustriert zu werden, besteht darin, es direkt mit einem anderen Datenbanktyp wie einem DBMS zu vergleichen oder eine bestimmte Erwartung für die Verwendung zu entwickeln. Es ist, als würde man eine Orange mit einer Gabel vergleichen. Datenbanksysteme haben bestimmte Ziele. Es ist am besten, diese Unterschiede einfach selbst zu verstehen und zu schätzen. Es wäre eine Schande, Druck auf MongoDB-Entwickler auszuüben, da sie gezwungen waren, dem DBMS-Pfad zu folgen. Ich möchte neue und aufregende Möglichkeiten zur Lösung alter Probleme sehen, z. B. die Gewährleistung der Datenintegrität und den Aufbau von Datensystemen, die gegen Fehler und Angriffe böswilliger Benutzer resistent sind.
Die 4.0-Implementierung der ACID-Transaktionalität in MongoDB ist ein gutes Beispiel dafür, wie wichtig Verbesserungen sind. Transaktionen mit mehreren Dokumenten und mehreren Anweisungen sind jetzt atomar. Es wurde auch möglich, die Zeit anzupassen, die erforderlich ist, um Sperren zu erwerben und blockierte Transaktionen abzuschließen sowie die Isolationsstufe zu ändern.