Después de añadir la validación de esquemas a una colección, puedes modificar las normas de validación en cualquier momento. Por ejemplo, puedes decidir:
Que los documentos en una colección
usersya no requieren una dirección de correo electrónico.Aumentar la longitud mínima para un campo
passwordde 8 a 12 caracteres.
Para modificar la validación de esquema de una colección, utiliza el comando collMod y especifica la validación actualizada en el objeto validator.
Acerca de esta tarea
Puede modificar la mayoría de los componentes de una validación de esquema, incluidas sus reglas, nivel de validación y acción de validación.
Nota
Si establece el nivel de validación en constraint, no podrá modificar directamente las reglas de validación del esquema. Para cambiar las reglas de validación, cambie al nivel strict, modifique las reglas y, a continuación, vuelva a actualizar al nivel constraint. Para obtener más información sobre este procedimiento, consulte Especificar la validación de restricciones.
Si actualiza las reglas de validación de una colección, es posible que los documentos insertados antes del cambio de validación ya no sean válidos. MongoDB maneja estos documentos no válidos preexistentes de manera diferente según su validationLevel.
En los niveles strict y moderate, MongoDB aplica comprobaciones de validación al insertar o actualizar un documento, pero no valida retroactivamente los documentos que ya se encuentran en la colección. Una actualización de un documento que ya no es válido falla, incluso si la actualización en sí no introduce la infracción.
En el nivel constraint, MongoDB valida toda la colección al actualizar a ese nivel. Si se regresa al nivel strict, se modifican las reglas y luego se vuelve a actualizar al nivel constraint, la actualización fallará si algún documento no coincide con las nuevas reglas.
Pasos
El siguiente procedimiento crea una colección con reglas de validación y luego modifica esas reglas.
Crea una colección con validación.
Crea una colección users con reglas de validación:
db.createCollection("users", { validator: { $jsonSchema: { bsonType: "object", required: [ "username", "password" ], properties: { username: { bsonType: "string", description: "must be a string and is required" }, password: { bsonType: "string", minLength: 8, description: "must be a string at least 8 characters long, and is required" } } } } } )
Modifica el esquema de validación.
Ejecute el siguiente comando collMod para cambiar el minLength del campo password de 8 a 12:
db.runCommand( { collMod: "users", validator: { $jsonSchema: { bsonType: "object", required: [ "username", "password" ], properties: { username: { bsonType: "string", description: "must be a string and is required" }, password: { bsonType: "string", minLength: 12, description: "must be a string of at least 12 characters, and is required" } } } } } )
Tip
También se puede usar el comando collMod para añadir validación a una colección existente que no se creó con validación.
Resultados
Las siguientes secciones muestran los resultados de la validación actualizada en estos escenarios:
Cuando insertas un documento no válido.
Cuando insertes un documento válido.
Cuando un documento previamente válido se vuelve inválido debido a los cambios en las reglas de validación.
Insertar un documento no válido
La siguiente operación intenta insertar un documento no válido. El documento no es válido porque el campo password tiene 10 caracteres cuando la longitud mínima es 12:
db.users.insertOne( { "username": "salesAdmin01", "password": "kT9$j4wg#M" } )
MongoDB devuelve el siguiente error:
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("62be0adb73c105dde9231299"), details: { operatorName: '$jsonSchema', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'password', description: 'must be a string of at least 8 characters, and is required', details: [ { operatorName: 'minLength', specifiedAs: { minLength: 12 }, reason: 'specified string length was not satisfied', consideredValue: 'kT9$j4wg#M' } ] } ] } ] } }
Inserta un documento válido
La siguiente operación inserta un documento válido, donde el campo password tiene al menos 12 caracteres de longitud:
db.users.insertOne( { "username": "salesAdmin01", "password": "8p&SQd7T90$KKx" } )
Gestionar un documento previamente válido que ya no lo es
Considerar el siguiente documento que es válido para la primera versión de la validación de esquema, pero no para la segunda:
db.users.insertOne( { "username": "salesAdmin02", "password": "i8U60*VyL8" } )
El campo password del documento tiene 10 caracteres. La primera versión de la validación de esquemas requería un mínimo de 8 caracteres, lo que significa que este documento era válido. Sin embargo, después de actualizar la validación para que el password requiera un mínimo de 12 caracteres, el documento ya no es válido.
Cuando un cambio en la validación de esquema hace que documentos anteriormente válidos se vuelvan inválidos, los documentos que ahora son inválidos permanecen en la colección.
La forma en que MongoDB gestiona documentos recientemente no válidos depende del validationLevel del esquema. La validación de esquema en este ejemplo utiliza el valor por defecto validationLevel de strict, lo que significa que el documento debe coincidir con las nuevas reglas de validación. MongoDB verifica la validación cada vez que se actualiza el documento.
Si la validación del esquema actualizada tuviese un validationLevel de moderate, este documento no necesitaría cumplir las nuevas reglas de validación.