Escolha como lidar com documentos inválidos
Nesta página
Você pode especificar como o MongoDB lida com documentos que violam as regras de validação. Quando uma operação resultaria em um documento inválido, o MongoDB pode:
Rejeite qualquer inserção ou atualização que viole os critérios de validação. Este é o comportamento padrão.
Permita que a operação prossiga, mas registre a violação no log MongoDB.
Rejeitar documentos inválidos garante que seu esquema permaneça consistente. No entanto, em determinados cenários, talvez você queira permitir documentos inválidos, como uma migração de dados que contenha documentos anteriores à criação de um esquema.
Contexto
A opção validationAction
do seu esquema determina como o MongoDB lida com documentos inválidos:
Ação de validação | Comportamento |
---|---|
error | (Padrão) o MongoDB rejeita qualquer inserção ou atualização que viole os critérios de validação. |
warn | O MongoDB permite que a operação continue, mas registra a violação no log do MongoDB. |
Opção 1: Rejeitar documentos inválidos
O procedimento a seguir mostra como criar uma validação de esquema que rejeita documentos inválidos.
Crie uma coleção com validationAction: "error"
.
Crie uma coleção do contacts
com um validador de JSON schema que tenha validationAction: "error"
:
db.createCollection( "contacts", { 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 end with '@mongodb.com'" } } } }, validationAction: "error" } )
O error
validationAction
faz com que o MongoDB rejeite quaisquer documentos inválidos e evite que eles sejam inseridos na coleção.
Tentar inserir um documento inválido.
Tente inserir o seguinte documento:
db.contacts.insertOne( { name: "Amanda", email: "amanda@xyz.com" } )
O documento viola a regra de validação porque:
O campo
email
não corresponde ao padrão de expressão regular. O campoemail
deve terminar em@mongodb.com
.O campo obrigatório
phone
está faltando.
A operação falha com o seguinte erro:
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("6377cca4aac957f2b77ea955"), details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'email', description: "must be a string and end with '@mongodb.com'", details: [ { operatorName: 'pattern', specifiedAs: { pattern: '@mongodb\\.com$' }, reason: 'regular expression did not match', consideredValue: 'amanda@xyz.com' } ] } ] }, { operatorName: 'required', specifiedAs: { required: [ 'phone' ] }, missingProperties: [ 'phone' ] } ] } }
Opção 2: permitir documentos inválidos, mas registrá-los no log
O procedimento a seguir mostra como criar uma validação de esquema que permite documentos inválidos, mas registra documentos inválidos no log MongoDB.
Crie uma coleção com validationAction: "warn"
.
Crie uma coleção do contacts2
com um validador de JSON schema que tenha validationAction: "warn"
:
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 end with '@mongodb.com'" } } } }, validationAction: "warn" } )
O warn
validationAction
permite que documentos inválidos sejam inseridos na collection. Os documentos inválidos são registrados no log do MongoDB.
Tentar inserir um documento inválido.
Tente inserir o seguinte documento:
db.contacts2.insertOne( { name: "Amanda", email: "amanda@xyz.com" } )
O documento viola a regra de validação porque:
O campo
email
não corresponde ao padrão de expressão regular. O campoemail
deve terminar em@mongodb.com
.O campo obrigatório
phone
está faltando.
Verificar os logs do documento inválido.
Para visualizar os logs do MongoDB em um formato legível, execute o seguinte comando:
db.adminCommand( { getLog:'global'} ).log.forEach(x => { print(x) } )
O log MongoDB inclui uma entrada semelhante ao seguinte objeto:
{ "t": { "$date": "2022-11-18T13:30:43.607-05:00" }, "s": "W", "c": "STORAGE", "id": 20294, "ctx": "conn2", "msg": "Document would fail validation", "attr": { "namespace": "test.contacts2", "document": { "_id": { "$oid": "6377cf53d59841355cac1cd0" }, "name": "Amanda", "email": "amanda@xyz.com" }, "errInfo": { "failingDocumentId": { "$oid": "6377cf53d59841355cac1cd0" }, "details": { "operatorName": "$jsonSchema", "schemaRulesNotSatisfied": [{ "operatorName": "properties", "propertiesNotSatisfied": [{ "propertyName": "email", "description": "must be a string and end with '@mongodb.com'", "details": [{ "operatorName": "pattern", "specifiedAs": { "pattern": "@mongodb\\.com$" }, "reason": "regular expression did not match", "consideredValue": "amanda@xyz.com" }] }] }, { "operatorName": "required", "specifiedAs": { "required": ["phone"] }, "missingProperties": ["phone"] }] } } } }