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 documentos. |
moderate | O MongoDB aplica as mesmas regras de validação a inserções e atualizações de documentos válidos existentes que correspondem às regras de validação. As atualizações em documentos existentes na coleção que não correspondam às regras de validação não são verificadas quanto à validade. |
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.