Especificar nível de validação para documentos existentes
Nesta página
Para documentos que já existem em sua coleta antes de adicionar validação, você pode especificar como o MongoDB aplica as regras de validação a esses documentos.
Contexto
O validationLevel
do seu esquema determina os documentos para os quais o MongoDB aplica as regras de validação:
Nível de validação | Comportamento |
---|---|
strict | (Padrão) O MongoDB aplica as mesmas regras de validação a todas as inserções e atualizações de documento . |
moderate | O MongoDB aplica as mesmas regras de validação para inserções e atualizações de documento em documentos válidos existentes que correspondem às regras de validação. As atualizações de documentos existentes na collection que não correspondem às regras de validação não são necessárias para passar a validação. |
Pré-requisitos
Os exemplos nesta página utilizam uma collection contacts
com estes documentos:
db.contacts.insertMany([ { "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" }, { "_id": 2, "name": "Ivan", "city": "Vancouver" } ])
Etapas: usar a strict
validação
O exemplo a seguir adiciona uma validação strict
à coleção contacts
e mostra os resultados ao tentar atualizar documentos inválidos.
Especifique as regras de validação com o strict
nível de validação.
Adicione um validador à coleção contacts
com strict
validationLevel
:
db.runCommand( { collMod: "contacts", validator: { $jsonSchema: { bsonType: "object", required: [ "phone", "name" ], properties: { phone: { bsonType: "string", description: "phone must be a string and is required" }, name: { bsonType: "string", description: "name must be a string and is required" } } } }, validationLevel: "strict" } )
Como o validationLevel
é strict
, quando qualquer documento é atualizado, o MongoDB verifica esse documento para validação.
Teste a validação.
Os comandos de atualização a seguir modificam os dois documento na coleção contacts
de forma que nenhum deles seja consistente com a regra de validação, que exige que name
seja uma string:
db.contacts.updateOne( { _id: 1 }, { $set: { name: 10 } } ) db.contacts.updateOne( { _id: 2 }, { $set: { name: 20 } } )
Observe os resultados.
Ambas as operações de atualização falham. O MongoDB retorna a seguinte saída para cada operação:
MongoServerError: Document failed validation Additional information: { failingDocumentId: <id>, details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'name', description: 'name must be a string and is required', details: [ { operatorName: 'bsonType', specifiedAs: { bsonType: 'string' }, reason: 'type did not match', consideredValue: <value>, consideredType: 'int' } ] } ] }, { operatorName: 'required', specifiedAs: { required: [ 'phone', 'name' ] }, missingProperties: [ 'phone' ] } ] } }
Etapas: usar a moderate
validação
O exemplo a seguir adiciona uma validação moderate
à coleção contacts
e mostra os resultados ao tentar atualizar documentos inválidos.
Especifique as regras de validação com o moderate
nível de validação.
Adicione um validador à coleção contacts
com moderate
validationLevel
:
db.runCommand( { collMod: "contacts", validator: { $jsonSchema: { bsonType: "object", required: [ "phone", "name" ], properties: { phone: { bsonType: "string", description: "phone must be a string and is required" }, name: { bsonType: "string", description: "name must be a string and is required" } } } }, validationLevel: "moderate" } )
Porque o validationLevel
é moderate
:
Se você atualizar o documento com
_id: 1
, o MongoDB aplicará as novas regras de validação porque o documento existente atende aos requisitos de validação.Se você atualizar o documento com
_id: 2
, o MongoDB não aplicará as novas regras de validação porque o documento existente não atende aos requisitos de validação.
Teste a validação.
Os comandos de atualização a seguir modificam os dois documento na coleção contacts
de forma que nenhum deles seja consistente com a regra de validação, que exige que name
seja uma string:
db.contacts.updateOne( { _id: 1 }, { $set: { name: 10 } } ) db.contacts.updateOne( { _id: 2 }, { $set: { name: 20 } } )
Observe os resultados.
O MongoDB retorna a seguinte saída para cada operação:
// _id: 1 MongoServerError: Document failed validation Additional information: { failingDocumentId: 1, details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'name', description: 'name must be a string and is required', details: [ { operatorName: 'bsonType', specifiedAs: { bsonType: 'string' }, reason: 'type did not match', consideredValue: 10, consideredType: 'int' } ] } ] } ] } } // _id: 2 { acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 0, upsertedCount: 0 }
A saída mostra:
A atualização falha no documento com
_id: 1
. Este documento atendeu aos requisitos de validação inicial e o MongoDB aplica regras de validação a este documento.A atualização do documento com
_id: 2
é bem-sucedida. Este documento não atendeu aos requisitos de validação inicial e o MongoDB não aplica regras de validação a este documento.
Importante
A saída de erro destina-se ao consumo humano. Pode mudar no futuro e não deve ser invocado em scripts.