Wszyscy wiedzą, że MongoDB jest bezschematowe, dlaczego więc wymagane jest przeprowadzanie walidacji schematu? Tworzenie aplikacji z zachowaniem bez schematu MongoDB jest łatwe i szybkie, a następnie używanie jej jako dowodu koncepcji. Ale gdy aplikacja przeniesie się do produkcji i stanie się stabilna i dojrzała, nie ma potrzeby częstej zmiany schematu i nie jest to również wskazane. W tej chwili bardzo ważne jest, aby wymusić walidację schematu w bazie danych, aby uniknąć wstawiania niechcianych danych, które mogą uszkodzić aplikację. Staje się to znacznie ważniejsze, gdy dane są wstawiane z wielu źródeł do tej samej bazy danych.
Walidacja schematu pozwala zdefiniować konkretną strukturę dokumentów w każdej kolekcji. Jeśli ktoś spróbuje wstawić jakieś dokumenty, które nie pasują do zdefiniowanego schematu, MongoDB może odrzucić tego rodzaju operację lub dać ostrzeżenia zgodnie z rodzajem akcji walidacji.
MongoDB zapewnia dwa sposoby sprawdzania poprawności schematu, sprawdzania poprawności dokumentów i sprawdzania poprawności schematu JSON. Walidacja schematu JSON jest rozszerzoną wersją walidacji dokumentów, więc zacznijmy od walidacji dokumentów.
Weryfikacja dokumentów
Większość programistów, którzy pracowali z relacyjnymi bazami danych, zna znaczenie przewidywalności modeli danych lub schematu. Dlatego MongoDB wprowadził walidację dokumentów od wersji 3.2. Zobaczmy, jak dodać reguły walidacji w kolekcjach MongoDB.
Załóżmy, że masz kolekcję użytkowników, którzy mają następujące typy dokumentów.
{
"name": "Alex",
"email": "[email protected]",
"mobile": "123-456-7890"
}
A oto walidacje, które chcemy sprawdzić podczas dodawania nowych dokumentów w kolekcji użytkowników:
- imię, pola e-mail są obowiązkowe
- Numery komórkowe powinny mieć określoną strukturę:xxx-xxx-xxxx
Aby dodać tę walidację, możemy użyć konstrukcji „validator” podczas tworzenia nowej kolekcji. Uruchom następujące zapytanie w powłoce 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}
}
]
}
})
Powinieneś zobaczyć następujące wyjście:
{ "ok" : 1 }
Teraz, jeśli spróbujesz dodać nowy dokument bez przestrzegania reguł walidacji, mongo wygeneruje błąd walidacji. Spróbuj uruchomić następujące zapytania wstawiania.
Zapytanie:1
db.users.insert({
"name": "akash"
})
Wyjście:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Zapytanie:2
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890"
})
Wyjście:
WriteResult({ "nInserted" : 1 })
Istnieją jednak pewne ograniczenia dotyczące podejścia do walidacji dokumentów, takie jak dodanie dowolnej liczby nowych par klucz-wartość do dokumentu i wstawienie ich do kolekcji. Nie można temu zapobiec poprzez walidację dokumentów. Rozważ następujący przykład,
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Wyjście:
WriteResult({ "nInserted" : 1 })
Poza tym walidacja dokumentu sprawdza tylko wartości. Załóżmy, że jeśli spróbujesz dodać dokument z "nmae" (literówka) jako kluczem zamiast "name", mongo uzna to za nowe pole i dokument zostanie wstawiony do bazy danych. Tych rzeczy należy unikać podczas pracy z produkcyjną bazą danych. Aby to wszystko obsłużyć, MongoDB wprowadził operator „jsonSchema” z konstrukcją „validator” z wersji 3.6. Zobaczmy, jak dodać te same reguły walidacji, co powyżej i uniknąć dodawania nowych/błędnie napisanych pól.
Kilkadziesiąt — Zostań administratorem baz danych MongoDB — wprowadzenie MongoDB do produkcjiDowiedz się, co trzeba wiedzieć, aby wdrażać, monitorować, zarządzać i skalować MongoDB. Pobierz za darmoWeryfikacja jsonSchema
Uruchom następujące polecenie w powłoce mongo, aby dodać reguły walidacji za pomocą operatora „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}$"
}
}
}
}
})
Zobaczmy teraz, co się stanie, gdy spróbujemy wstawić następujący dokument.
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Spowoduje to błąd, ponieważ nie zdefiniowaliśmy pola płci w "jsonSchema".
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
W ten sam sposób, jeśli masz literówki w jakichkolwiek nazwach pól, mongo wyrzuci ten sam błąd.
Zdefiniowany powyżej schemat jest taki sam, jak ten, którego użyliśmy do walidacji dokumentów. Dodatkowo dodaliśmy pole „additionalProperties”, aby uniknąć literówek w nazwach pól i dodawania nowych pól w dokumentach. Zezwoli tylko na pola, które są zdefiniowane w polu "właściwości". Oto przegląd niektórych właściwości, których możemy użyć pod operatorem „jsonSchema”.
- bsonType:tablica | obiekt | ciąg | wartość logiczna | numer | brak
- wymagane:tablica wszystkich pól obowiązkowych
- enum:tablica tylko możliwych wartości dla dowolnego pola
- minimum:minimalna wartość pola
- maksimum:maksymalna wartość pola
- minLength:minimalna długość pola
- mixLength:maksymalna długość pola
- właściwości:kolekcja prawidłowych schematów JSON
- additionalProperties:powstrzymuje nas przed dodawaniem innych pól niż wymienione w polu właściwości
- tytuł:tytuł dowolnego pola.
- opis:krótki opis dowolnego pola.
Oprócz walidacji schematu, operator "jsonSchema" może być również używany na etapie wyszukiwania i dopasowywania wewnątrz potoku agregacji.
Wniosek
Walidacja dokumentów/schematu nie jest wymagana ani pożądana we wszystkich sytuacjach, ale generalnie dobrą praktyką jest dodanie ich do bazy danych, ponieważ zwiększy to produktywność programistów zajmujących się bazą danych. Będą wiedzieć, jakiego rodzaju odpowiedzi oczekiwać od bazy danych, ponieważ nie będzie żadnych losowych danych.
W tym artykule dowiedzieliśmy się, jak ważna jest walidacja schematu w MongoDB i jak dodawać walidacje na poziomie dokumentu za pomocą walidacji dokumentów i operatora „jsonSchema”.