Para los documentos que ya existen en tu colección antes de añadir validación, puedes especificar cómo MongoDB aplica las reglas de validación a estos documentos.
Context
De 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 en esta página utilizan una colección contacts con los siguientes documentos:
db.contacts.insertMany([ { "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" }, { "_id": 2, "name": "Ivan", "city": "Vancouver" } ])
Pasos: Use strict 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.
Especifica reglas de validación con el nivel de validación strict.
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" } )
Como el validationLevel es strict, cuando se actualiza cualquier documento, MongoDB verifica la validación de ese documento.
Probar 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 } } )
Inspeccione los resultados.
Ambas operaciones de actualización fallan. MongoDB devuelve la siguiente salida 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: Use moderate 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.
Especifica reglas de validación con el nivel de validación moderate.
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" } )
Debido a que el validationLevel es moderate:
Si actualizas 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 actualizas el documento con
_id: 2, MongoDB no aplica las nuevas reglas de validación porque el documento existente no se ajusta a los requisitos de validación.
Probar 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 } } )
Inspeccione los 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 es exitosa para el documento con
_id: 2. Este documento no cumplió con los requisitos de validación iniciales, y MongoDB no aplica las reglas de validación a este documento.
Importante
La salida de errores está destinada al uso humano. Podría cambiar en el futuro y no debe dependerse de ello en scripts.