Nuevo en la versión 3.2.
MongoDB proporciona la capacidad de realizar la validación del esquema durante las actualizaciones e inserciones.
Puedes implementar la validación de esquema en la interfaz de usuario para implementaciones alojadas en MongoDB Atlas.
Especificar reglas de validación
Las reglas de validación se basan en cada colección.
Para especificar reglas de validación al crear una nueva colección, utilice
db.createCollection()con la validator opción.
Para agregar la validación de documentos a una colección existente, utilice el comando con collMod la validator opción.
MongoDB también proporciona las siguientes opciones relacionadas:
validationLevelopción, que determina con qué rigor MongoDB aplica las reglas de validación a los documentos existentes durante una actualización.validationActionopción, que determina si MongoDB debeerrory rechazar documentos que violen las reglas de validación owarnsobre las violaciones en el registro pero permitir documentos no válidos.
JSON Schema
Nuevo en la versión 3.6.
A partir de la 3.6 versión, MongoDB admite la validación de esquemas JSON. Para especificar la validación de esquemas JSON, utilice el operador en $jsonSchema su validator expresión.
Nota
El esquema JSON es el medio recomendado para realizar la validación del esquema.
Por ejemplo, el siguiente ejemplo especifica reglas de validación utilizando el esquema JSON:
db.createCollection("students", { validator: { $jsonSchema: { bsonType: "object", required: [ "name", "year", "major", "address" ], properties: { name: { bsonType: "string", description: "must be a string and is required" }, year: { bsonType: "int", minimum: 2017, maximum: 3017, description: "must be an integer in [ 2017, 3017 ] and is required" }, major: { enum: [ "Math", "English", "Computer Science", "History", null ], description: "can only be one of the enum values and is required" }, gpa: { bsonType: [ "double" ], description: "must be a double if the field exists" }, address: { bsonType: "object", required: [ "city" ], properties: { street: { bsonType: "string", description: "must be a string if the field exists" }, city: { bsonType: "string", description: "must be a string and is required" } } } } } } })
Para obtener más información, consulta $jsonSchema.
bsonType Las definiciones se pueden encontrar en la página Tipos BSON.
Otras expresiones de consulta
Además de la validación de JSON Schema que utiliza el operador del query $jsonSchema, MongoDB admite validaciones con otros operadores del query, con la excepción de:
Por ejemplo, el siguiente ejemplo especifica reglas de validación utilizando la expresión de consulta:
db.createCollection( "contacts", { validator: { $or: [ { phone: { $type: "string" } }, { email: { $regex: /@mongodb\.com$/ } }, { status: { $in: [ "Unknown", "Incomplete" ] } } ] } } )
Comportamiento
La validación se produce durante las actualizaciones e inserciones. Al añadir validación a una colección, los documentos existentes no se someten a comprobaciones de validación hasta su modificación.
Para realizar comprobaciones de validación en documentos existentes, utilice el comando validate db.collection.validate() o el ayudante de shell.
Documentos existentes
La opción validationLevel determina en qué operaciones MongoDB aplica las reglas de validación:
Si
validationLevelesstrict(el valor predeterminado), MongoDB aplica reglas de validación a todas las inserciones y actualizaciones.Si el
validationLevelesmoderate, MongoDB aplica reglas de validación a inserciones y actualizaciones de documentos existentes que ya cumplen los criterios de validación. Con el nivelmoderate, las actualizaciones de los documentos existentes que no cumplen con los criterios de validación no se verifican para comprobar su validez.
Por ejemplo, crea una colección contacts con los siguientes documentos:
db.contacts.insert([ { "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" }, { "_id": 2, "name": "Ivan", "city": "Vancouver" } ])
Emita el siguiente comando para agregar un validador a la colección contacts:
db.runCommand( { collMod: "contacts", validator: { $jsonSchema: { bsonType: "object", required: [ "phone", "name" ], properties: { phone: { bsonType: "string", description: "must be a string and is required" }, name: { bsonType: "string", description: "must be a string and is required" } } } }, validationLevel: "moderate" } )
La colección contacts ahora tiene un validador con el nivel de validación moderate:
Si intentó actualizar el documento con
_id: 1, MongoDB aplicaría las nuevas reglas de validación ya que el documento existente coincide con los criterios.Por el contrario, MongoDB no aplicará reglas de validación a las actualizaciones del documento con
_id: 2ya que no cumple con las reglas de validación.
A partir de la versión 5.0 de MongoDB, el validador devuelve información detallada de errores cuando no se cumple una condición de validación. La salida de errores es exhaustiva: se informan todos los errores, no solo el primero.
Importante
La salida de error es para uso humano. Puede cambiar en el futuro y no debe utilizarse en scripts.
En el siguiente ejemplo, ninguna de las actualizaciones es coherente con la regla de validación que creamos anteriormente, que requiere que name sea una cadena.
db.contacts.update( { _id: 1 }, { $set: { name: 10 } } ) db.contacts.update( { _id: 2 }, { $set: { name: 20 } } )
El resultado a continuación muestra que el documento con _id: 1 no supera la validación, con una explicación detallada, como se muestra en el objeto errInfo. La actualización se realiza correctamente para el documento con _id: 2, ya que este no cumplía los criterios iniciales al agregar la validación.
// _id: 1 WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 121, "errmsg" : "Document failed validation", "errInfo" : { "failingDocumentId" : 1, "details" : { "operatorName" : "$jsonSchema", "schemaRulesNotSatisfied" : [ { "operatorName" : "properties", "propertiesNotSatisfied" : [ { "propertyName" : "name", "details" : [ { "operatorName" : "bsonType", "specifiedAs" : { "bsonType" : "string" }, "reason" : "type did not match", "consideredValue" : 10, "consideredType" : "double" } ] } ] } ] } } } }) // _id: 2 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Para deshabilitar la validación por completo, puede establecer validationLevel en off.
Aceptar o rechazar documentos no válidos
La opción validationAction determina cómo MongoDB maneja los documentos que violan las reglas de validación:
Si
validationActioneserror(el valor predeterminado), MongoDB rechaza cualquier inserción o actualización que viole los criterios de validación.Si
validationActioneswarn, MongoDB registra cualquier violación pero permite que continúe la inserción o actualización.
Por ejemplo, cree una colección contacts2 con el siguiente validador de esquema JSON:
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 match the regular expression pattern" }, status: { enum: [ "Unknown", "Incomplete" ], description: "can only be one of the enum values" } } } }, validationAction: "warn" } )
warn validationActionCon, MongoDB registra cualquier violación pero permite que la inserción o actualización continúe.
Por ejemplo, la siguiente operación de inserción viola la regla de validación:
db.contacts2.insertOne( { name: "Amanda", status: "Updated" } )
Sin embargo, dado que validationAction solo es warn, MongoDB solo registra el mensaje de violación de validación y permite que la operación continúe. Ejecute el siguiente comando para ver los registros de MongoDB:
db.adminCommand( { getLog: "global" } )
Dependiendo del uso de la colección, este comando puede devolver gran cantidad de datos. El error de validación (una línea larga en el registro, aquí reformateada para mejorar la legibilidad) contiene información como esta:
"{\"t\":{\"$date\":\"2021-01-20T15:59:57.305+00:00\"}, \"s\":\"W\", \"c\":\"STORAGE\", \"id\":20294, \"ctx\":\"conn1\", \"msg\":\"Document would fail validation\", \"attr\":{\"namespace\":\"test.contacts2\", \"document\":{\"_id\":{\"$oid\":\"6008537d42e0d23385568881\"}, \"name\":\"Amanda\", \"status\":\"Updated\"}, \"errInfo\":{\"failingDocumentId\":{\"$oid\":\"6008537d42e0d23385568881\"}, \"details\":{\"operatorName\":\"$jsonSchema\", \"schemaRulesNotSatisfied\":[ {\"operatorName\":\"properties\", \"propertiesNotSatisfied\":[ {\"propertyName\":\"status\", \"details\":[ {\"operatorName\":\"enum\", \"specifiedAs\":{\"enum\":[ \"Unknown\", \"Incomplete\"]}, \"reason\":\"value was not found in enum\", \"consideredValue\":\"Updated\"}]}]}, {\"operatorName\":\"required\", \"specifiedAs\":{\"required\":[\"phone\"]}, \"missingProperties\":[\"phone\"]}]}}}}"
Restricciones
No se puede especificar un validador para colecciones en las bases de datos admin, local y config.
No se puede especificar un validador para las colecciones de system.*.
Omitir la validación de documentos
Los usuarios pueden omitir la validación del documento utilizando la opción bypassDocumentValidation.
Los siguientes comandos pueden omitir la validación por operación utilizando la nueva opción bypassDocumentValidation:
applyOpsComandofindAndModifycomando ydb.collection.findAndModify()métodomapReducecomando ydb.collection.mapReduce()métodoinsertComandoupdateComando$outy$mergeetapas para el comandoaggregatey el métododb.collection.aggregate()
En las implementaciones con control de acceso habilitado, para omitir la validación de documentos, el usuario autenticado debe tener la acciónbypassDocumentValidation. Los roles integradosdbAdminyrestorepermiten esta acción.