Každý ví, že MongoDB je bez schématu, tak proč je nutné provádět ověření schématu? Je snadné a rychlé vyvinout aplikaci s chováním MongoDB bez schématu a použít ji jako důkaz konceptu. Jakmile se však aplikace přesune do produkce a stane se stabilní a vyspělou, není potřeba často měnit schéma a není to ani vhodné. V tuto chvíli je velmi důležité vynutit určité ověření schématu ve vaší databázi, aby nedošlo k vložení nechtěných dat, která by mohla poškodit vaši aplikaci. To se stává mnohem důležitějším, když jsou data vkládána z více zdrojů do stejné databáze.
Validace schématu umožňuje definovat specifickou strukturu dokumentů v každé kolekci. Pokud se někdo pokusí vložit nějaké dokumenty, které se neshodují s definovaným schématem, MongoDB může tento druh operace odmítnout nebo vydat varování podle typu akce ověření.
MongoDB poskytuje dva způsoby, jak ověřit vaše schéma, ověření dokumentu a ověření schématu JSON. Ověření schématu JSON je rozšířená verze ověřování dokumentů, takže začněme ověřováním dokumentů.
Ověření dokumentu
Většina vývojářů, kteří pracovali s relačními databázemi, zná důležitost předvídatelnosti datových modelů nebo schémat. Proto MongoDB zavedlo ověřování dokumentů od verze 3.2. Podívejme se, jak přidat ověřovací pravidla do sbírek MongoDB.
Předpokládejme, že máte kolekci uživatelů, kteří mají následující typy dokumentů.
{
"name": "Alex",
"email": "[email protected]",
"mobile": "123-456-7890"
}
A následují ověření, která chceme zkontrolovat při přidávání nových dokumentů do kolekce uživatelů:
- jméno, e-mailová pole jsou povinná
- Čísla mobilních telefonů by měla mít specifickou strukturu:xxx-xxx-xxxx
Chcete-li přidat toto ověření, můžeme při vytváření nové kolekce použít konstrukci „validátor“. Spusťte následující dotaz v prostředí Mongo,
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}
}
]
}
})
Měli byste vidět následující výstup:
{ "ok" : 1 }
Pokud se nyní pokusíte přidat jakýkoli nový dokument bez dodržení pravidel ověření, mongo vyvolá chybu ověření. Zkuste spustit následující vkládací dotazy.
Dotaz:1
db.users.insert({
"name": "akash"
})
Výstup:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Dotaz:2
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890"
})
Výstup:
WriteResult({ "nInserted" : 1 })
Existují však určitá omezení s přístupem k ověřování dokumentů, například lze do dokumentu přidat libovolný počet nových párů klíč-hodnota a vložit je do kolekce. Tomu nelze zabránit ověřením dokumentu. Zvažte následující příklad,
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Výstup:
WriteResult({ "nInserted" : 1 })
Kromě toho validace dokumentu kontroluje pouze hodnoty. Předpokládejme, že pokud se pokusíte přidat dokument s klíčem „nmae“ (překlep) místo „jména“, mongo jej bude považovat za nové pole a dokument bude vložen do DB. Těmto věcem byste se měli vyhnout, když pracujete s produkční databází. Aby toto vše podpořil, MongoDB zavedl operátor „jsonSchema“ s konstrukcí „validator“ od verze 3.6. Podívejme se, jak přidat stejná ověřovací pravidla jako výše a vyhnout se přidávání nových/chybně napsaných polí.
Somenines Staňte se MongoDB DBA – Uvedení MongoDB do produkce Zjistěte, co potřebujete vědět, abyste mohli nasadit, monitorovat, spravovat a škálovat MongoDBDdownload zdarmaOvěření jsonSchema
Spusťte následující příkaz v mongo shell a přidejte ověřovací pravidla pomocí operátoru "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}$"
}
}
}
}
})
Podívejme se nyní, co se stane, když se pokusíme vložit následující dokument.
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Vyvolá to chybu, protože jsme nedefinovali pole pohlaví v "jsonSchema".
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Stejným způsobem, pokud máte v názvech polí překlepy, mongo vyvolá stejnou chybu.
Schéma definované výše je stejné jako to, které jsme použili při ověřování dokumentu. Navíc jsme přidali pole „additionalProperties“, abychom se vyhnuli překlepům v názvech polí a přidávání nových polí do dokumentů. Povolí pouze pole, která jsou definována v poli "vlastnosti". Zde je přehled některých vlastností, které můžeme použít pod operátorem "jsonSchema".
- bsonType:pole | objekt | řetězec | boolean | číslo | null
- povinné:pole všech povinných polí
- enum:pole pouze možných hodnot pro libovolné pole
- minimum:minimální hodnota pole
- maximum:maximální hodnota pole
- minLength:minimální délka pole
- mixLength:maximální délka pole
- vlastnosti:kolekce platných schémat JSON
- additionalProperties:zabrání nám přidávat jakákoli jiná pole, než jsou uvedena v poli vlastností
- title:název libovolného pole.
- popis:krátký popis libovolného pole.
Kromě ověření schématu lze operátor „jsonSchema“ použít také ve fázi hledání a shody v rámci agregačního kanálu.
Závěr
Ověřování dokumentů/schémat není vyžadováno ani žádoucí ve všech situacích, ale obecně je dobré je přidat do databáze, protože to zvýší produktivitu vývojářů, kteří s vaší databází pracují. Budou vědět, jaký druh odezvy od databáze očekávat, protože zde nebudou žádná náhodná data.
V tomto článku jsme se dozvěděli o důležitosti ověřování schémat v MongoDB a o tom, jak přidat ověření na úrovni dokumentu pomocí ověření dokumentu a operátoru "jsonSchema".