Alle ved, at MongoDB er skemaløs, hvorfor er det så nødvendigt at udføre skemavalidering? Det er nemt og hurtigt at udvikle applikationen med MongoDBs skemaløse adfærd og bruge den som et proof of concept. Men når først applikationen flytter til produktion og bliver stabil og moden, er der ingen grund til at ændre skemaet ofte, og det er heller ikke tilrådeligt. På nuværende tidspunkt er det meget vigtigt at gennemtvinge en vis skemavalidering i din database for at undgå, at der indsættes uønskede data, som kan ødelægge din applikation. Dette bliver meget vigtigere, når data indsættes fra flere kilder i den samme database.
Skemavalidering giver dig mulighed for at definere den specifikke struktur af dokumenter i hver samling. Hvis nogen forsøger at indsætte nogle dokumenter, som ikke stemmer overens med det definerede skema, kan MongoDB afvise denne form for handling eller give advarsler i henhold til typen af valideringshandling.
MongoDB giver to måder at validere dit skema på, dokumentvalidering og JSON-skemavalidering. JSON Schema validering er den udvidede version af dokumentvalidering, så lad os starte med dokumentvalidering.
Dokumentvalidering
De fleste af de udviklere, der har arbejdet med relationelle databaser, kender vigtigheden af forudsigelighed af datamodellerne eller skemaet. Derfor introducerede MongoDB dokumentvalidering fra version 3.2. Lad os se, hvordan du tilføjer valideringsregler i MongoDB-samlinger.
Antag, at du har en samling af brugere, som har følgende typer dokumenter.
{
"name": "Alex",
"email": "[email protected]",
"mobile": "123-456-7890"
}
Og følgende er de valideringer, som vi ønsker at kontrollere, mens vi tilføjer nye dokumenter i brugersamling:
- navn, e-mail-felter er obligatoriske
- mobilnumre skal følge den specifikke struktur:xxx-xxx-xxxx
For at tilføje denne validering kan vi bruge "validator"-konstruktionen, mens vi opretter en ny samling. Kør følgende forespørgsel i Mongo shell,
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}
}
]
}
})
Du bør se følgende output:
{ "ok" : 1 }
Nu, hvis du prøver at tilføje et nyt dokument uden at følge valideringsreglerne, vil mongo kaste en valideringsfejl. Prøv at køre følgende indsættelsesforespørgsler.
Forespørgsel:1
db.users.insert({
"name": "akash"
})
Output:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Forespørgsel:2
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890"
})
Output:
WriteResult({ "nInserted" : 1 })
Der er dog nogle begrænsninger med tilgang til dokumentvalidering, såsom at man kan tilføje et hvilket som helst antal nye nøgleværdi-par til dokumentet og indsætte det i samlingen. Dette kan ikke forhindres ved dokumentvalidering. Overvej følgende eksempel,
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Output:
WriteResult({ "nInserted" : 1 })
Ud over dette kontrollerer dokumentvalidering kun for værdierne. Antag, at hvis du forsøger at tilføje dokumentet med "nmae"(tastfejl) som en nøgle i stedet for "navn", vil mongo betragte det som et nyt felt, og dokumentet vil blive indsat i DB. Disse ting bør undgås, når du arbejder med produktionsdatabasen. For at understøtte alt dette introducerede MongoDB "jsonSchema"-operatoren med "validator"-konstruktion fra version 3.6. Lad os se, hvordan du tilføjer de samme valideringsregler som ovenfor og undgår at tilføje nye/fejlstavede felter.
Severalnines Bliv en MongoDB DBA - Bring MongoDB to ProductionFå flere oplysninger om, hvad du skal vide for at implementere, overvåge, administrere og skalere MongoDBDownload gratisjsonSchema-validering
Kør følgende kommando i mongo-shell for at tilføje valideringsreglerne ved hjælp af "jsonSchema"-operatoren.
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}$"
}
}
}
}
})
Lad os nu se, hvad der sker, når vi forsøger at indsætte følgende dokument.
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Det vil give en fejl, da vi ikke har defineret kønsfeltet i "jsonSchema".
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
På samme måde, hvis du har tastefejl i nogen feltnavne, vil mongo give den samme fejl.
Skemaet defineret ovenfor er det samme som det, vi brugte til dokumentvalidering. Derudover tilføjede vi feltet "yderligere egenskaber" for at undgå tastefejl i feltnavne og tilføjelse af nye felter i dokumenter. Det vil kun tillade felter, der er defineret under "egenskaber"-feltet. Her er oversigten over nogle egenskaber, som vi kan bruge under operatoren "jsonSchema".
- bsonType:array | objekt | streng | boolsk | nummer | null
- påkrævet:en række af alle obligatoriske felter
- enum:en matrix med kun mulige værdier for ethvert felt
- minimum:mindste værdi af feltet
- maksimum:feltets maksimale værdi
- minLængde:minimumlængde af feltet
- mixLength:feltets maksimale længde
- egenskaber:en samling af gyldige JSON-skemaer
- additionalProperties:forhindrer os i at tilføje andre felter end nævnt under egenskabsfeltet
- titel:titel for ethvert felt.
- beskrivelse:kort beskrivelse af ethvert felt.
Ud over skemavalidering kan "jsonSchema"-operatoren også bruges i find- og match-fasen inde i aggregeringspipelinen.
Konklusion
Dokument-/skemavalidering er ikke påkrævet eller ønskelig i alle situationer, men generelt er det en god praksis at tilføje dem i din database, da det vil øge produktiviteten for udviklere, der beskæftiger sig med din database. De vil vide, hvilken slags respons de kan forvente fra databasen, da der ikke vil være nogen tilfældige data.
I denne artikel lærte vi om vigtigheden af skemavalidering i MongoDB, og hvordan man tilføjer valideringer på dokumentniveau ved hjælp af dokumentvalidering og "jsonSchema"-operatoren.