Todo mundo sabe que o MongoDB não tem esquema, então por que é necessário realizar a validação do esquema? É fácil e rápido desenvolver o aplicativo com o comportamento sem esquema do MongoDB e usá-lo como prova de conceito. Mas uma vez que o aplicativo passa para a produção e se torna estável e maduro, não há necessidade de alterar o esquema com frequência e também não é aconselhável. Neste momento, é muito importante impor alguma validação de esquema em seu banco de dados para evitar a inserção de dados indesejados que podem interromper seu aplicativo. Isso se torna muito mais importante quando os dados estão sendo inseridos de várias fontes no mesmo banco de dados.
A validação de esquema permite definir a estrutura específica dos documentos em cada coleção. Se alguém tentar inserir alguns documentos que não correspondem ao esquema definido, o MongoDB pode rejeitar esse tipo de operação ou dar avisos de acordo com o tipo de ação de validação.
O MongoDB fornece duas maneiras de validar seu esquema, validação de documento e validação de esquema JSON. A validação do esquema JSON é a versão estendida da validação do documento, então vamos começar com a validação do documento.
Validação do documento
A maioria dos desenvolvedores que trabalharam com bancos de dados relacionais conhece a importância da previsibilidade dos modelos de dados ou esquema. Portanto, o MongoDB introduziu a validação de documentos a partir da versão 3.2. Vamos ver como adicionar regras de validação nas coleções do MongoDB.
Suponha que você tenha uma coleção de usuários com os seguintes tipos de documentos.
{
"name": "Alex",
"email": "[email protected]",
"mobile": "123-456-7890"
}
E, a seguir, estão as validações que queremos verificar ao adicionar novos documentos na coleção de usuários:
- nome, campos de e-mail são obrigatórios
- os números de celular devem seguir uma estrutura específica:xxx-xxx-xxxx
Para adicionar essa validação, podemos usar a construção “validator” ao criar uma nova coleção. Execute a seguinte consulta no shell do 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}
}
]
}
})
Você deve ver a seguinte saída:
{ "ok" : 1 }
Agora, se você tentar adicionar qualquer novo documento sem seguir as regras de validação, o mongo lançará um erro de validação. Tente executar as seguintes consultas de inserção.
Consulta:1
db.users.insert({
"name": "akash"
})
Saída:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Consulta:2
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890"
})
Saída:
WriteResult({ "nInserted" : 1 })
No entanto, existem algumas restrições com a abordagem de validação de documentos, como pode-se adicionar qualquer número de novos pares de valores-chave ao documento e inseri-lo na coleção. Isso não pode ser evitado pela validação do documento. Considere o seguinte exemplo,
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Saída:
WriteResult({ "nInserted" : 1 })
Além disso, a validação do documento verifica apenas os valores. Suponha que, se você tentar adicionar o documento com "nmae"(typo) como chave em vez de "nome", o mongo o considerará como um novo campo e o documento será inserido no banco de dados. Essas coisas devem ser evitadas quando você estiver trabalhando com o banco de dados de produção. Para suportar tudo isso, o MongoDB introduziu o operador "jsonSchema" com a construção "validator" da versão 3.6. Vamos ver como adicionar as mesmas regras de validação acima e evitar adicionar campos novos/com erros ortográficos.
Vários noves Torne-se um DBA do MongoDB - Trazendo o MongoDB para a produçãoSaiba mais sobre o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o MongoDBBaixe gratuitamente
Validação do esquema json
Execute o seguinte comando no shell do mongo para adicionar as regras de validação usando o operador "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}$"
}
}
}
}
})
Vamos ver agora, o que acontece quando tentamos inserir o seguinte documento.
db.users.insert({
"name": "akash",
"email": "[email protected]",
"mobile": "123-456-7890",
"gender": "Male"
})
Ele lançará um erro, pois não definimos o campo de gênero no "jsonSchema".
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Da mesma forma, se você tiver erros de digitação em qualquer nome de campo, o mongo lançará o mesmo erro.
O esquema definido acima é o mesmo que usamos na validação do documento. Além disso, adicionamos o campo "additionalProperties" para evitar erros de digitação nos nomes dos campos e a adição de novos campos nos documentos. Permitirá apenas os campos definidos no campo "propriedades". Aqui está a visão geral de algumas propriedades que podemos usar no operador "jsonSchema".
- bsonType:array | objeto | seqüência | booleano | número | nulo
- obrigatório:uma matriz de todos os campos obrigatórios
- enum:uma matriz de apenas valores possíveis para qualquer campo
- mínimo:valor mínimo do campo
- máximo:valor máximo do campo
- minLength:comprimento mínimo do campo
- mixLength:comprimento máximo do campo
- propriedades:uma coleção de esquemas JSON válidos
- additionalProperties:nos impede de adicionar outros campos além dos mencionados no campo de propriedades
- título:título para qualquer campo.
- descrição:breve descrição de qualquer campo.
Além da validação do esquema, o operador "jsonSchema" também pode ser usado no estágio de localização e correspondência dentro do pipeline de agregação.
Conclusão
As validações de documento/esquema não são obrigatórias ou desejáveis em todas as situações, mas geralmente é uma boa prática adicioná-las ao seu banco de dados, pois isso aumentará a produtividade dos desenvolvedores que estão lidando com seu banco de dados. Eles saberão que tipo de resposta esperar do banco de dados, pois não haverá dados aleatórios.
Neste artigo, aprendemos sobre a importância da validação de esquema no MongoDB e como adicionar validações no nível do documento usando validação de documento e o operador "jsonSchema".