Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/

Validação de esquema

Nesta página

  • Especificar regras de validação
  • JSON schema
  • Outras expressões de query
  • Comportamento
  • Restrições
  • bypassDocumentValidation
  • Informações adicionais

Novo na versão 3.2.

O MongoDB fornece o recurso de realizar validação de esquema durante atualizações e inserções.

As regras de validação são por collection.

Para especificar regras de validação ao criar uma nova collection, use db.createCollection() com a opção validator .

Para adicionar validação de documento a uma collection existente, use o comando collMod com a opção validator .

O MongoDB também fornece as seguintes opções relacionadas:

  • validationLevel opção, que determina o quão estritamente o MongoDB aplica as regras de validação aos documentos existentes durante uma atualização.

  • validationAction opção, que determina se o MongoDB deve error e rejeitar documentos que violem as regras de validação ou warn sobre as violações no registro, mas permitir documentos inválidos.

Novidade na versão 3.6.

A partir da versão 3.6, O MongoDB suporta validação de JSON schema. Para especificar a validação do JSON schema, use o operador $jsonSchema em sua expressão validator .

Observação

O JSON schema é o meio recomendado de realizar a validação de esquema.

Por exemplo, o seguinte exemplo especifica regras de validação utilizando JSON schema:

db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double if the field exists"
},
address: {
bsonType: "object",
required: [ "city" ],
properties: {
street: {
bsonType: "string",
description: "must be a string if the field exists"
},
city: {
bsonType: "string",
description: "must be a string and is required"
}
}
}
}
}
}
})

Para mais informações, consulte $jsonSchema.

bsonType definições podem ser encontradas na página de BSON types .

Além da validação do JSON schema que usa o operador de query $jsonSchema , o MongoDB suporta validação com outros operadores de query, com exceção de:

Por exemplo, o exemplo a seguir especifica regras de validação usando a expressão de query:

db.createCollection( "contacts",
{ validator: { $or:
[
{ phone: { $type: "string" } },
{ email: { $regex: /@mongodb\.com$/ } },
{ status: { $in: [ "Unknown", "Incomplete" ] } }
]
}
} )

Dica

Veja também:

A validação ocorre durante atualizações e inserções. Quando você adiciona validação a uma collection, os documentos existentes não passam por verificações de validação até a modificação.

Para executar verificações de validação em documentos existentes, use o comando validate ou o auxiliar de shell db.collection.validate() .

A opção validationLevel determina em quais operações o MongoDB aplica as regras de validação:

  • Se o validationLevel for strict (o padrão), o MongoDB aplicará regras de validação a todas as inserções e atualizações.

  • Se o validationLevel for moderate, o MongoDB aplicará regras de validação às inserções e atualizações dos documentos existentes que já atendem aos critérios de validação. Com o nível moderate , as atualizações de documentos existentes que não atendem aos critérios de validação não são verificadas quanto à validade.

Por exemplo, criar uma coleção contacts com os seguintes documentos:

db.contacts.insert([
{ "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" },
{ "_id": 2, "name": "Ivan", "city": "Vancouver" }
])

Emitir o seguinte comando para adicionar um validador à coleção contacts :

db.runCommand( {
collMod: "contacts",
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone", "name" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
name: {
bsonType: "string",
description: "must be a string and is required"
}
}
} },
validationLevel: "moderate"
} )

A collection contacts agora tem um validador com o validationLevel moderate :

  • Se você tentasse atualizar o documento com _id: 1, o MongoDB aplicaria as novas regras de validação, pois o documento existente corresponde aos critérios.

  • Por outro lado, o MongoDB não aplicará regras de validação a atualizações do documento com _id: 2 , pois ele não atende às regras de validação.

A partir da versão 5.0 do MongoDB, o validador retorna informações de erro detalhadas quando uma condição de validação não é atendida. A saída de erro é exaustiva - todos os erros são relatados, não apenas o primeiro.

Importante

A saída de erro destina-se ao consumo humano. Pode mudar no futuro e não deve ser invocado em scripts.

No próximo exemplo, nenhuma das atualizações é consistente com a regra de validação que criamos acima, que exige que name seja uma string.

db.contacts.update(
{ _id: 1 },
{ $set: { name: 10 } }
)
db.contacts.update(
{ _id: 2 },
{ $set: { name: 20 } }
)

A saída abaixo mostra que o documento com _id: 1 falha na validação com uma explicação detalhada, conforme mostrado no objeto errInfo . A atualização para o documento com _id: 2 é bem-sucedida, pois esse documento não atendeu aos critérios iniciais quando a validação foi adicionada.

// _id: 1
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation",
"errInfo" : {
"failingDocumentId" : 1,
"details" : {
"operatorName" : "$jsonSchema",
"schemaRulesNotSatisfied" : [
{
"operatorName" : "properties",
"propertiesNotSatisfied" : [
{
"propertyName" : "name",
"details" : [
{
"operatorName" : "bsonType",
"specifiedAs" : {
"bsonType" : "string"
},
"reason" : "type did not match",
"consideredValue" : 10,
"consideredType" : "double"
}
]
}
]
}
]
}
}
}
})
// _id: 2
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Para desabilitar totalmente a validação, você pode definir validationLevel como off.

A opção validationAction determina como o MongoDB lida com documentos que violam as regras de validação:

  • Se o validationAction for error (o padrão), o MongoDB rejeitará qualquer inserção ou atualização que viole os critérios de validação.

  • Se o validationAction for warn, o MongoDB registrará quaisquer violações, mas permitirá que a inserção ou atualização continue.

Por exemplo, crie uma collection do contacts2 com o seguinte validador de JSON schema:

db.createCollection( "contacts2", {
validator: { $jsonSchema: {
bsonType: "object",
required: [ "phone" ],
properties: {
phone: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType : "string",
pattern : "@mongodb\.com$",
description: "must be a string and match the regular expression pattern"
},
status: {
enum: [ "Unknown", "Incomplete" ],
description: "can only be one of the enum values"
}
}
} },
validationAction: "warn"
} )

Com o warn validationAction, o MongoDB registra quaisquer violações, mas permite que a inserção ou atualização continue.

Por exemplo, a seguinte operação de inserção viola a regra de validação:

db.contacts2.insertOne( { name: "Amanda", status: "Updated" } )

No entanto, como validationAction é apenas warn , o MongoDB registra apenas a mensagem de violação de validação e permite que a operação continue. Execute o seguinte comando para visualizar os registros do MongoDB:

db.adminCommand( { getLog: "global" } )

Dependendo do uso da collection, este comando pode retornar muitos dados. O erro de validação (uma linha longa no registro, reformatado aqui para legibilidade) contém informações como esta:

"{\"t\":{\"$date\":\"2021-01-20T15:59:57.305+00:00\"},
\"s\":\"W\",
\"c\":\"STORAGE\",
\"id\":20294,
\"ctx\":\"conn1\",
\"msg\":\"Document would fail validation\",
\"attr\":{\"namespace\":\"test.contacts2\",
\"document\":{\"_id\":{\"$oid\":\"6008537d42e0d23385568881\"},
\"name\":\"Amanda\",
\"status\":\"Updated\"},
\"errInfo\":{\"failingDocumentId\":{\"$oid\":\"6008537d42e0d23385568881\"},
\"details\":{\"operatorName\":\"$jsonSchema\",
\"schemaRulesNotSatisfied\":[
{\"operatorName\":\"properties\",
\"propertiesNotSatisfied\":[
{\"propertyName\":\"status\",
\"details\":[
{\"operatorName\":\"enum\",
\"specifiedAs\":{\"enum\":[
\"Unknown\",
\"Incomplete\"]},
\"reason\":\"value was not found in enum\",
\"consideredValue\":\"Updated\"}]}]},
{\"operatorName\":\"required\",
\"specifiedAs\":{\"required\":[\"phone\"]},
\"missingProperties\":[\"phone\"]}]}}}}"

Você não pode especificar um validador para collections nos bancos de dados admin, local e config.

Você não pode especificar um validador para collections system.* .

Os usuários podem ignorar a validação do documento usando a opção bypassDocumentValidation .

Os seguintes comandos podem ignorar a validação por operação utilizando a nova opção bypassDocumentValidation:

Para sistemas que habilitaram o controle de acesso, para ignorar a validação do documento, o usuário autenticado deve ter a açãobypassDocumentValidation. Os papéis embutidos dbAdmin e restore fornecem esta ação.

Voltar

Introdução