Puede especificar cómo MongoDB gestiona los documentos que infringen las reglas de validación. Cuando una operación genera un documento no válido, MongoDB puede:
Rechazar cualquier inserción o actualización que infrinja los criterios de validación. Este es el comportamiento predeterminado.
Permita que la operación continúe, pero registre la violación en el registro de MongoDB.
Rechazar documentos no válidos garantiza la coherencia del esquema. Sin embargo, en ciertos casos, podría ser conveniente permitir documentos no válidos, como una migración de datos que contenga documentos anteriores a la creación del esquema.
Context
Tu esquema validationAction La opción determina cómo MongoDB maneja los documentos no válidos:
Acción de validación | Comportamiento |
|---|---|
| (Predeterminado) MongoDB rechaza cualquier inserción o actualización que viole los criterios devalidación. |
| MongoDB permite que la operación continúe, pero registra la violación en el registro de MongoDB. |
| MongoDB rechaza cualquier inserción o actualización que viole los criterios de validación y registra el error en el archivo de registro Nuevo en la versión 8.1. |
Nota
Si usa una acción de validación errorAndLog en una colección, MongoDB no podrá degradar su versión hasta que elimine la colección o si cambia la acción de validación de la colección a una compatible con versiones anteriores. Para cambiar la acción de validación en una colección, use el collMod dominio.
Opción 1: Rechazar documentos no válidos
El siguiente procedimiento muestra cómo crear una validación de esquema que rechace documentos no válidos.
Crea una colección validationAction: "error" con.
Cree una colección contacts con un validador de esquema JSON que tenga 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" } )
El error validationAction hace que MongoDB rechace cualquier documento no válido y evita que se inserte en la colección.
Intente insertar un documento no válido.
Intente insertar el siguiente documento:
db.contacts.insertOne( { name: "Amanda", email: "amanda@xyz.com" } )
El documento viola la regla de validación porque:
El campo
emailno coincide con el patrón de expresión regular. El campoemaildebe terminar en@mongodb.com.Falta el campo obligatorio
phone.
La operación falla con el siguiente error:
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' ] } ] } }
Opción 2: Permitir documentos no válidos, pero registrarlos en el registro
El siguiente procedimiento muestra cómo crear una validación de esquema que permite documentos no válidos, pero registra documentos no válidos en el registro de MongoDB.
Crea una colección validationAction: "warn" con.
Cree una colección contacts2 con un validador de esquema JSON que tenga 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" } )
El warn validationAction permite insertar documentos no válidos en la colección. Estos documentos se registran en el registro de MongoDB.
Intente insertar un documento no válido.
Intente insertar el siguiente documento:
db.contacts2.insertOne( { name: "Amanda", email: "amanda@xyz.com" } )
El documento viola la regla de validación porque:
El campo
emailno coincide con el patrón de expresión regular. El campoemaildebe terminar en@mongodb.com.Falta el campo obligatorio
phone.
Verifique los registros en busca del documento no válido.
Para ver los registros de MongoDB en un formato legible, ejecute el siguiente comando:
db.adminCommand( { getLog:'global'} ).log.forEach(x => { print(x) } )
El registro de MongoDB incluye una entrada similar al siguiente 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"] }] } } } }