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.
Permitir que la operación continúe, pero registrar la infracción en el registro de MongoDB.
Rechazar documentos no válidos garantiza que tu esquema permanezca coherente. Sin embargo, en ciertos escenarios puede que desee permitir documentos no válidos, como una migración de datos que contenga documentos de antes de que se estableciera un esquema.
Context
De tu esquema validationAction la opción determina cómo MongoDB gestiona los documentos no válidos:
Acción de validación | Comportamiento |
|---|---|
| (Por defecto) MongoDB rechaza cualquier inserción o actualización que viole los criterios de validación. |
| MongoDB permite que la operación continúe, pero registra la infracción en el registro de MongoDB. |
Opción 1: rechazar documentos inválidos
El siguiente procedimiento muestra cómo crear una validación de esquema que rechace documentos no válidos.
Crea una colección con validationAction: "error".
Cree una colección de contacts con un validador de JSON schema 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 inválido y evite que se inserte en la colección.
Intento de 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 requerido
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 Inválidos, pero Registrarlos en el Registro
El siguiente procedimiento muestra cómo crear una validación de esquema que permite documentos inválidos, pero registra documentos inválidos en el registro de MongoDB.
Crea una colección con validationAction: "warn".
Cree una colección de contacts2 con un validador de JSON schema 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. Los documentos no válidos se registran en el registro de MongoDB.
Intento de 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 requerido
phone.
Revisa los registros para el documento invá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"] }] } } } }