Para los documentos que ya existen en su colección antes de agregar la validación, puede especificar cómo MongoDB aplica las reglas de validación a estos documentos.
Context
Tu esquema validationLevel determina los documentos para los cuales MongoDB aplica reglas de validación:
Nivel de validación | Comportamiento |
|---|---|
| (Predeterminado) MongoDB aplica las mismas reglas de validación a todas las inserciones y actualizaciones de documentos. |
| MongoDB aplica las mismas reglas de validación a las inserciones y actualizaciones de documentos válidos existentes que cumplen con dichas reglas. Las actualizaciones de documentos existentes en la colección que no cumplen con dichas reglas no requieren la validación. |
Requisito previo
Los ejemplos de esta página utilizan una colección contacts con estos documentos:
db.contacts.insertMany([ { "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" }, { "_id": 2, "name": "Ivan", "city": "Vancouver" } ])
Pasos:strict Utilice la validación
El siguiente ejemplo añade una validación strict a la colección contacts y muestra los resultados cuando se intenta actualizar documentos no válidos.
Especifique reglas de validación con strict nivel de validación.
Agregue un validador a la colección contacts con 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" } )
Debido a que validationLevel es strict, cuando se actualiza cualquier documento, MongoDB verifica ese documento para su validación.
Pruebe la validación.
Los siguientes comandos de actualización modifican ambos documentos en la colección contacts de modo que ninguno de los documentos sea consistente con la regla de validación que requiere que name sea una cadena:
db.contacts.updateOne( { _id: 1 }, { $set: { name: 10 } } ) db.contacts.updateOne( { _id: 2 }, { $set: { name: 20 } } )
Observar resultados.
Ambas operaciones de actualización fallan. MongoDB devuelve el siguiente resultado para cada operación:
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' ] } ] } }
Pasos:moderate Utilice la validación
El siguiente ejemplo añade una validación moderate a la colección contacts y muestra los resultados cuando se intenta actualizar documentos no válidos.
Especifique reglas de validación con moderate nivel de validación.
Agregue un validador a la colección contacts con 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 el validationLevel es moderate:
Si actualiza el documento con
_id: 1, MongoDB aplica las nuevas reglas de validación porque el documento existente cumple con los requisitos de validación.Si actualiza el documento con
_id: 2, MongoDB no aplica las nuevas reglas de validación porque el documento existente no cumple con los requisitos de validación.
Pruebe la validación.
Los siguientes comandos de actualización modifican ambos documentos en la colección contacts de modo que ninguno de los documentos sea consistente con la regla de validación que requiere que name sea una cadena:
db.contacts.updateOne( { _id: 1 }, { $set: { name: 10 } } ) db.contacts.updateOne( { _id: 2 }, { $set: { name: 20 } } )
Observar resultados.
MongoDB devuelve la siguiente salida para cada operación:
// _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 }
La salida muestra:
La actualización falla para el documento con
_id: 1. Este documento cumplió con los requisitos de validación iniciales y MongoDB le aplica reglas de validación.La actualización del documento con
_id: 2se realizó correctamente. Este documento no cumplió con los requisitos de validación iniciales y MongoDB no le aplica reglas de validación.
Importante
La salida de error es para uso humano. Puede cambiar en el futuro y no debe utilizarse en scripts.