JSON Schema es un vocabulario que permite anotar y validar documentos JSON. Utilice JSON Schema para especificar reglas de validación para sus campos en un formato legible para humanos.
Context
MongoDB admite el borrador 4 de JSON Schema, incluidos especificación central y especificación de validación, con algunas diferencias. Para más detalles, consulte Extensiones y Omisiones.
Para obtener más información sobre JSON Schema, consulta el sitio web oficial.
Restricciones
No puedes especificar la validación del esquema para:
Colecciones en el
adminlocal, yconfigbases de datos
Si tiene Cifrado a nivel de campo del lado del cliente o Queryable Encryption habilitado en una colección, la validación está sujeta a las siguientes restricciones:
Para CSFLE, al
collModejecutar, la biblioteca libmongocrypt prefiere el esquema de cifrado JSON especificado en el comando. Esta preferencia permite establecer un esquema en una colección que aún no tiene uno.Para Queryable Encryption, cualquier JSON schema que incluya un campo cifrado resulta en un error de análisis de query.
Pasos
En este ejemplo, se crea una colección students con reglas de validación y se pueden observar los resultados después de intentar insertar un documento no válido.
Realizar la conexión a la implementación de MongoDB.
Para conectarse a una instancia local de MongoDB o a una implementación de MongoDB Atlas mongosh mediante, consulte Conectarse a una implementación o Conectarse a través de mongosh.
Crea una colección con validación.
En mongosh, ejecute el siguiente comando para crear una colección students y use el operador $jsonSchema para establecer reglas de validación de esquema:
db.createCollection("students", { validator: { $jsonSchema: { bsonType: "object", title: "Student Object Validation", required: [ "address", "major", "name", "year" ], properties: { name: { bsonType: "string", description: "'name' must be a string and is required" }, year: { bsonType: "int", minimum: 2017, maximum: 3017, description: "'year' must be an integer in [ 2017, 3017 ] and is required" }, gpa: { bsonType: [ "double" ], description: "'gpa' must be a double if the field exists" } } } } } )
Tip
Aclara las reglas con los campos de título y descripción
Utilice los campos title y description para explicar las reglas de validación que no resulten evidentes de inmediato. Cuando un documento no supera la validación, MongoDB incluye estos campos en el mensaje de error.
Confirma que la validación impide documentos no válidos.
Ejecuta el siguiente comando. La operación de inserción falla porque gpa es un número entero cuando validator requiere un double.
db.students.insertOne( { name: "Alice", year: Int32( 2019 ), major: "History", gpa: Int32(3), address: { city: "NYC", street: "33rd Street" } } )
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("630d093a931191850b40d0a9"), details: { operatorName: '$jsonSchema', title: 'Student Object Validation', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'gpa', description: "'gpa' must be a double if the field exists", details: [ { operatorName: 'bsonType', specifiedAs: { bsonType: [ 'double' ] }, reason: 'type did not match', consideredValue: 3, consideredType: 'int' } ] } ] } ] } }
Tip
Por defecto, mongosh imprime objetos anidados hasta seis niveles de profundidad. Para imprimir todos los objetos anidados en su máxima profundidad, configura inspectDepth a Infinity.
config.set("inspectDepth", Infinity)
Insert a valid document.
Si cambia el valor del campo gpa a un tipo double, la operación de inserción se realiza con éxito. Ejecute el siguiente comando para insertar el documento válido:
db.students.insertOne( { name: "Alice", year: Int32(2019), major: "History", gpa: Double(3.0), address: { city: "NYC", street: "33rd Street" } } )
Query para el documento válido.
Para confirmar que has insertado correctamente el documento, ejecuta el siguiente comando para el query de la colección students:
db.students.find()
[ { _id: ObjectId("62bb413014b92d148400f7a5"), name: 'Alice', year: 2019, major: 'History', gpa: 3, address: { city: 'NYC', street: '33rd Street' } } ]
Tip
Si estás conectado a una implementación de Atlas, también puedes ver y filtrar el documento en la Interfaz de usuario de Atlas.
Información Adicional
Puedes combinar la validación de esquema JSON con la validación del operador del query.
Por ejemplo, considere una colección sales con esta validación de esquema:
db.createCollection("sales", { validator: { "$and": [ // Validation with query operators { "$expr": { "$lt": ["$lineItems.discountedPrice", "$lineItems.price"] } }, // Validation with JSON Schema { "$jsonSchema": { "properties": { "items": { "bsonType": "array" } } } } ] } } )
La validación anterior aplica estas reglas para los documentos de la colección sales:
lineItems.discountedPricedebe ser menorlineItems.priceque. Esta regla utiliza el$ltoperador.El
itemscampo debe ser una matriz. Esta regla$jsonSchemautiliza.
Obtén más información
Para obtener una lista completa de las palabras clave permitidas en el esquema JSON, consulte Palabras clave disponibles.
Para restringir los valores que puede contener un determinado campo, consulte Especificar valores permitidos para el campo.
Para evitar problemas con la validación del esquema JSON,consulte los consejos para la validación del esquema JSON.