Iedereen weet dat MongoDB schemaloos is, waarom is het dan nodig om schemavalidatie uit te voeren? Het is gemakkelijk en snel om de applicatie te ontwikkelen met MongoDB's schemaloze gedrag en het te gebruiken als een proof of concept. Maar zodra de applicatie in productie gaat en stabiel en volwassen wordt, is het niet nodig om het schema vaak te wijzigen en het is ook niet aan te raden. Op dit moment is het erg belangrijk om schemavalidatie in uw database af te dwingen om te voorkomen dat ongewenste gegevens worden ingevoegd die uw toepassing kunnen beschadigen. Dit wordt veel belangrijker wanneer gegevens uit meerdere bronnen in dezelfde database worden ingevoegd.
Met schemavalidatie kunt u de specifieke structuur van documenten in elke collectie definiëren. Als iemand documenten probeert in te voegen die niet overeenkomen met het gedefinieerde schema, kan MongoDB dit soort bewerking weigeren of waarschuwingen geven op basis van het type validatieactie.
MongoDB biedt twee manieren om uw schema te valideren:documentvalidatie en JSON-schemavalidatie. JSON Schema-validatie is de uitgebreide versie van documentvalidatie, dus laten we beginnen met documentvalidatie.
Documentvalidatie
De meeste ontwikkelaars die met relationele databases hebben gewerkt, kennen het belang van voorspelbaarheid van de datamodellen of het schema. Daarom introduceerde MongoDB documentvalidatie vanaf versie 3.2. Laten we eens kijken hoe we validatieregels kunnen toevoegen aan MongoDB-verzamelingen.
Stel dat u een verzameling gebruikers heeft met de volgende soorten documenten.
{
"name": "Alex",
"email": "[email protected]",
"mobile": "123-456-7890"
}
En hierna volgen de validaties die we willen controleren terwijl we nieuwe documenten toevoegen aan de gebruikersverzameling:
- naam, e-mailvelden zijn verplicht
- mobiele nummers moeten een specifieke structuur volgen:xxx-xxx-xxxx
Om deze validatie toe te voegen, kunnen we de 'validator'-constructie gebruiken bij het maken van een nieuwe verzameling. Voer de volgende query uit in 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}
}
]
}
})
U zou de volgende uitvoer moeten zien:
{ "ok" : 1 }
Als u nu een nieuw document probeert toe te voegen zonder de validatieregels te volgen, geeft mongo een validatiefout. Probeer de volgende invoegquery's uit te voeren.
Vraag:1
db.users.insert({
"name": "akash"
})
Uitgang:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Vraag:2
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890"
})
Uitgang:
WriteResult({ "nInserted" : 1 })
Er zijn echter enkele beperkingen bij de benadering van documentvalidatie, zoals het toevoegen van een willekeurig aantal nieuwe sleutel-waardeparen aan het document en deze in de verzameling invoegen. Dit kan niet worden voorkomen door documentvalidatie. Beschouw het volgende voorbeeld,
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Uitgang:
WriteResult({ "nInserted" : 1 })
Afgezien hiervan controleert documentvalidatie alleen de waarden. Stel dat als u het document probeert toe te voegen met "nmae" (typfout) als sleutel in plaats van "naam", Mongo het als een nieuw veld zal beschouwen en het document in de DB zal worden ingevoegd. Deze dingen moeten worden vermeden wanneer u met de productiedatabase werkt. Om dit alles te ondersteunen, introduceerde MongoDB de "jsonSchema" -operator met "validator" -constructie vanaf versie 3.6. Laten we eens kijken hoe we dezelfde validatieregels als hierboven kunnen toevoegen en voorkomen dat nieuwe/verkeerd gespelde velden worden toegevoegd.
Multiplenines Word een MongoDB DBA - MongoDB naar productie brengenLeer over wat u moet weten om MongoDB gratis te implementeren, bewaken, beheren en schalenjsonSchema-validatie
Voer de volgende opdracht uit in de mongo-shell om de validatieregels toe te voegen met de operator "jsonSchema".
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}$"
}
}
}
}
})
Laten we eens kijken wat er gebeurt als we het volgende document proberen in te voegen.
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Het zal een foutmelding geven omdat we het geslachtsveld niet hebben gedefinieerd in het "jsonSchema".
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Op dezelfde manier, als je typfouten hebt in veldnamen, geeft mongo dezelfde fout.
Het hierboven gedefinieerde schema is hetzelfde als het schema dat we hebben gebruikt bij documentvalidatie. Daarnaast hebben we het veld "additionalProperties" toegevoegd om typefouten in veldnamen en het toevoegen van nieuwe velden in documenten te voorkomen. Het zal alleen velden toestaan die zijn gedefinieerd in het veld "eigenschappen". Hier is het overzicht van enkele eigenschappen die we kunnen gebruiken onder de operator "jsonSchema".
- bsonType:array | voorwerp | tekenreeks | boolean | nummer | null
- vereist:een array van alle verplichte velden
- enum:een array van alleen mogelijke waarden voor elk veld
- minimum:minimale waarde van het veld
- maximum:maximale waarde van het veld
- minLength:minimale lengte van het veld
- mixLength:maximale lengte van het veld
- eigenschappen:een verzameling geldige JSON-schema's
- additionalProperties:voorkomt dat we andere velden toevoegen dan vermeld onder het eigenschappenveld
- titel:titel voor elk veld.
- beschrijving:korte beschrijving voor elk veld.
Naast schemavalidatie kan de operator "jsonSchema" ook worden gebruikt in de zoek- en matchfase binnen de aggregatiepijplijn.
Conclusie
Validatie van documenten/schema's is niet in alle situaties vereist of wenselijk, maar over het algemeen is het een goede gewoonte om ze aan uw database toe te voegen, aangezien dit de productiviteit van ontwikkelaars die met uw database te maken hebben, zal verhogen. Ze weten wat voor soort reactie ze van de database kunnen verwachten, aangezien er geen willekeurige gegevens zullen zijn.
In dit artikel hebben we geleerd over het belang van schemavalidatie in MongoDB en hoe u validaties op documentniveau kunt toevoegen met behulp van documentvalidatie en de "jsonSchema"-operator.