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

Escolha como lidar com documentos inválidos

Nesta página

  • Contexto
  • Opção 1: Rejeitar documentos inválidos
  • Opção 2: permitir documentos inválidos, mas registrá-los no log
  • Saiba mais

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.

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.

O procedimento a seguir mostra como criar uma validação de esquema que rejeita documentos inválidos.

1

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.

2

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 campo email 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' ]
}
]
}
}

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.

1

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.

2

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 campo email deve terminar em @mongodb.com.

  • O campo obrigatório phone está faltando.

3

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"]
}]
}
}
}
}
  • Mensagens de registro

  • Especificar nível de validação para documentos existentes

Voltar

Especificar nível de validação