Jeder weiß, dass MongoDB schemalos ist, warum ist es dann erforderlich, eine Schemavalidierung durchzuführen? Es ist einfach und schnell, die Anwendung mit dem schemalosen Verhalten von MongoDB zu entwickeln und als Konzeptnachweis zu verwenden. Sobald die Anwendung jedoch in die Produktion übergeht und stabil und ausgereift ist, besteht keine Notwendigkeit, das Schema häufig zu ändern, und es ist auch nicht ratsam. Zu diesem Zeitpunkt ist es sehr wichtig, eine gewisse Schemavalidierung in Ihrer Datenbank zu erzwingen, um zu vermeiden, dass unerwünschte Daten eingefügt werden, die Ihre Anwendung beschädigen können. Dies wird viel wichtiger, wenn Daten aus mehreren Quellen in dieselbe Datenbank eingefügt werden.
Die Schemavalidierung ermöglicht es Ihnen, die spezifische Struktur von Dokumenten in jeder Sammlung zu definieren. Wenn jemand versucht, Dokumente einzufügen, die nicht mit dem definierten Schema übereinstimmen, kann MongoDB diese Art von Operation ablehnen oder je nach Art der Validierungsaktion Warnungen ausgeben.
MongoDB bietet zwei Möglichkeiten zur Validierung Ihres Schemas, Dokumentvalidierung und JSON-Schemavalidierung. Die JSON-Schemavalidierung ist die erweiterte Version der Dokumentenvalidierung, also beginnen wir mit der Dokumentenvalidierung.
Dokumentvalidierung
Die meisten Entwickler, die mit relationalen Datenbanken gearbeitet haben, wissen um die Bedeutung der Vorhersagbarkeit von Datenmodellen oder -schemata. Daher hat MongoDB die Dokumentenvalidierung ab Version 3.2 eingeführt. Sehen wir uns an, wie man Validierungsregeln in MongoDB-Sammlungen hinzufügt.
Angenommen, Sie haben eine Sammlung von Benutzern mit den folgenden Dokumenttypen.
{
"name": "Alex",
"email": "[email protected]",
"mobile": "123-456-7890"
}
Und im Folgenden sind die Validierungen aufgeführt, die wir beim Hinzufügen neuer Dokumente zur Benutzersammlung überprüfen möchten:
- Name, E-Mail-Felder sind Pflichtfelder
- Handynummern sollten einer bestimmten Struktur folgen:xxx-xxx-xxxx
Um diese Validierung hinzuzufügen, können wir beim Erstellen einer neuen Sammlung das Konstrukt „validator“ verwenden. Führen Sie die folgende Abfrage in der Mongo-Shell aus,
db.createCollection("users", {
validator: {
$and: [
{
"name": {$type: "string", $exists: true}
},
{
"mobile": {$type: "string", $regex: /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/}
},
{
"email": {$type: "string", $exists: true}
}
]
}
})
Sie sollten die folgende Ausgabe sehen:
{ "ok" : 1 }
Wenn Sie nun versuchen, ein neues Dokument hinzuzufügen, ohne die Validierungsregeln zu befolgen, gibt Mongo einen Validierungsfehler aus. Versuchen Sie, die folgenden Einfügungsabfragen auszuführen.
Abfrage:1
db.users.insert({
"name": "akash"
})
Ausgabe:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Abfrage:2
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890"
})
Ausgabe:
WriteResult({ "nInserted" : 1 })
Es gibt jedoch einige Einschränkungen beim Dokumentenvalidierungsansatz, z. B. kann man dem Dokument eine beliebige Anzahl neuer Schlüssel-Wert-Paare hinzufügen und es in die Sammlung einfügen. Dies kann nicht durch Dokumentenvalidierung verhindert werden. Betrachten Sie das folgende Beispiel,
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Ausgabe:
WriteResult({ "nInserted" : 1 })
Abgesehen davon prüft die Dokumentenvalidierung nur die Werte. Angenommen, wenn Sie versuchen, das Dokument mit „nmae“ (Tippfehler) als Schlüssel anstelle von „Name“ hinzuzufügen, betrachtet Mongo es als neues Feld und das Dokument wird in die DB eingefügt. Diese Dinge sollten vermieden werden, wenn Sie mit der Produktionsdatenbank arbeiten. Um all dies zu unterstützen, hat MongoDB ab Version 3.6 den „jsonSchema“-Operator mit „validator“-Konstrukt eingeführt. Sehen wir uns an, wie Sie dieselben Validierungsregeln wie oben hinzufügen und das Hinzufügen neuer/falsch geschriebener Felder vermeiden.
Multiplenines Become a MongoDB DBA – Bringing MongoDB to ProductionErfahren Sie, was Sie wissen müssen, um MongoDBDownload for Free bereitzustellen, zu überwachen, zu verwalten und zu skalierenjsonSchema-Validierung
Führen Sie den folgenden Befehl in der Mongo-Shell aus, um die Validierungsregeln mit dem Operator „jsonSchema“ hinzuzufügen.
db.runCommand(
{
"collMod": "users_temp",
"validator": {
"$jsonSchema": {
"bsonType": "object",
"additionalProperties": false,
"required": [
"name",
"email"
],
"properties": {
"_id": {},
"name": {
"bsonType": "string"
},
"email": {
"bsonType": "string"
},
"mobile": {
"bsonType": "string",
"pattern": "^[0-9]{3}-[0-9]{3}-[0-9]{4}$"
}
}
}
}
})
Mal sehen, was passiert, wenn wir versuchen, das folgende Dokument einzufügen.
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Es wird einen Fehler ausgeben, da wir kein Geschlechtsfeld im „jsonSchema“ definiert haben.
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Wenn Sie Tippfehler in Feldnamen haben, gibt Mongo denselben Fehler aus.
Das oben definierte Schema ist dasselbe wie das, das wir bei der Dokumentenvalidierung verwendet haben. Außerdem haben wir das Feld „additionalProperties“ hinzugefügt, um Tippfehler in Feldnamen und das Hinzufügen neuer Felder in Dokumenten zu vermeiden. Es werden nur Felder zugelassen, die im Feld "Eigenschaften" definiert sind. Hier ist die Übersicht über einige Eigenschaften, die wir unter dem Operator "jsonSchema" verwenden können.
- bsonType:Array | Objekt | Zeichenfolge | boolesch | Zahl | null
- erforderlich:ein Array aller Pflichtfelder
- enum:ein Array von nur möglichen Werten für jedes Feld
- Minimum:Mindestwert des Feldes
- Maximum:Maximalwert des Feldes
- minLength:Mindestlänge des Feldes
- mixLength:maximale Länge des Feldes
- Eigenschaften:eine Sammlung gültiger JSON-Schemas
- additionalProperties:hindert uns daran, andere Felder als die unter Eigenschaftsfeld erwähnten hinzuzufügen
- title:Titel für ein beliebiges Feld.
- Beschreibung:kurze Beschreibung für ein beliebiges Feld.
Abgesehen von der Schemavalidierung kann der „jsonSchema“-Operator auch in der Find-and-Match-Phase innerhalb der Aggregationspipeline verwendet werden.
Schlussfolgerung
Dokument-/Schema-Validierungen sind nicht in allen Situationen erforderlich oder wünschenswert, aber im Allgemeinen ist es eine gute Praxis, sie in Ihre Datenbank aufzunehmen, da dies die Produktivität von Entwicklern erhöht, die mit Ihrer Datenbank arbeiten. Sie wissen, welche Art von Antwort sie von der Datenbank erwarten können, da es keine zufälligen Daten gibt.
In diesem Artikel haben wir gelernt, wie wichtig die Schemavalidierung in MongoDB ist und wie man mithilfe der Dokumentvalidierung und des „jsonSchema“-Operators Validierungen auf Dokumentebene hinzufügt.