sql >> Base de Datos >  >> NoSQL >> MongoDB

Una descripción general de la validación del esquema MongoDB

Todo el mundo sabe que MongoDB no tiene esquema, entonces, ¿por qué se requiere realizar la validación del esquema? Es fácil y rápido desarrollar la aplicación con el comportamiento sin esquema de MongoDB y usarla como prueba de concepto. Pero una vez que la aplicación pasa a producción y se vuelve estable y madura, no hay necesidad de cambiar el esquema con frecuencia y tampoco es recomendable. En este momento, es muy importante aplicar alguna validación de esquema en su base de datos para evitar que se inserten datos no deseados que pueden dañar su aplicación. Esto se vuelve mucho más importante cuando se insertan datos de múltiples fuentes en la misma base de datos.

La validación de esquema le permite definir la estructura específica de los documentos en cada colección. Si alguien intenta insertar algunos documentos que no coinciden con el esquema definido, MongoDB puede rechazar este tipo de operación o dar advertencias según el tipo de acción de validación.

MongoDB proporciona dos formas de validar su esquema, la validación de documentos y la validación de esquemas JSON. La validación de esquema JSON es la versión extendida de la validación de documentos, así que comencemos con la validación de documentos.

Validación de documentos

La mayoría de los desarrolladores que han trabajado con bases de datos relacionales conocen la importancia de la previsibilidad de los modelos o esquemas de datos. Por lo tanto, MongoDB introdujo la validación de documentos a partir de la versión 3.2. Veamos cómo agregar reglas de validación en las colecciones de MongoDB.

Suponga que tiene una colección de usuarios que tienen los siguientes tipos de documentos.

{
    "name": "Alex",
    "email": "[email protected]",
    "mobile": "123-456-7890"
} 

Y, a continuación, se encuentran las validaciones que queremos verificar al agregar nuevos documentos en la colección de usuarios:

  • nombre, los campos de correo electrónico son obligatorios
  • los números de móvil deben seguir una estructura específica:xxx-xxx-xxxx

Para agregar esta validación, podemos usar la construcción "validador" al crear una nueva colección. Ejecute la siguiente consulta en el shell de Mongo,

db.createCollection("users", {
  validator: {
        $and: [
            {
                "name": {$type: "string", $exists: true}
            },
            {
                "mobile": {$type: "string", $regex: /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/}
            },
            {
                "email": {$type: "string", $exists: true}
            }
        ]
    }
})

Debería ver el siguiente resultado:

{ "ok" : 1 }

Ahora, si intenta agregar cualquier documento nuevo sin seguir las reglas de validación, mongo arrojará un error de validación. Intente ejecutar las siguientes consultas de inserción.

Consulta:1

db.users.insert({
    "name": "akash"
})

Salida:

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

Consulta:2

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890"
})

Salida:

WriteResult({ "nInserted" : 1 })

Sin embargo, existen algunas restricciones con el enfoque de validación de documentos, como que uno puede agregar cualquier número de nuevos pares clave-valor al documento e insertarlo en la colección. Esto no se puede evitar mediante la validación de documentos. Considere el siguiente ejemplo,

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890",
    "gender": "Male"
})

Salida:

WriteResult({ "nInserted" : 1 })

Aparte de esto, la validación de documentos solo verifica los valores. Supongamos que si intenta agregar el documento con "nmae" (error tipográfico) como clave en lugar de "nombre", Mongo lo considerará como un nuevo campo y el documento se insertará en la base de datos. Estas cosas deben evitarse cuando se trabaja con la base de datos de producción. Para respaldar todo esto, MongoDB introdujo el operador "jsonSchema" con la construcción "validator" de la versión 3.6. Veamos cómo agregar las mismas reglas de validación que las anteriores y evitar agregar campos nuevos o mal escritos.

Varios nueves Conviértase en un administrador de bases de datos de MongoDB - Llevando MongoDB a la producción Obtenga información sobre lo que necesita saber para implementar, monitorear, administrar y escalar MongoDBDescargar gratis

Validación de esquema json

Ejecute el siguiente comando en mongo Shell para agregar las reglas de validación usando el operador "jsonSchema".

db.runCommand(
  {
    "collMod": "users_temp",
    "validator": {
      "$jsonSchema": {
        "bsonType": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "email"
        ],
        "properties": {
          "_id": {},
          "name": {
            "bsonType": "string"
          },
          "email": {
            "bsonType": "string"
          },
          "mobile": {
            "bsonType": "string",
            "pattern": "^[0-9]{3}-[0-9]{3}-[0-9]{4}$"
          }
        }
      }
    }
  })

Veamos ahora, qué sucede cuando intentamos insertar el siguiente documento.

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890",
    "gender": "Male"
})

Lanzará un error ya que no hemos definido el campo de género en el "jsonSchema".

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

De la misma manera, si tiene errores tipográficos en los nombres de los campos, mongo arrojará el mismo error.

El esquema definido anteriormente es el mismo que usamos en la validación de documentos. Además, agregamos el campo "propiedades adicionales" para evitar errores tipográficos en los nombres de los campos y la adición de nuevos campos en los documentos. Permitirá solo los campos que se definen en el campo "propiedades". Aquí está la descripción general de algunas propiedades que podemos usar bajo el operador "jsonSchema".

  • bsonType:matriz | objeto | cadena | booleano | número | nulo
  • obligatorio:una matriz de todos los campos obligatorios
  • enum:una matriz de solo valores posibles para cualquier campo
  • minimum:valor mínimo del campo
  • maximum:valor máximo del campo
  • minLength:longitud mínima del campo
  • mixLength:longitud máxima del campo
  • propiedades:una colección de esquemas JSON válidos
  • propiedades adicionales:nos impide agregar otros campos además de los mencionados en el campo de propiedades
  • título:título para cualquier campo.
  • descripción:breve descripción de cualquier campo.

Además de la validación del esquema, el operador "jsonSchema" también se puede usar en la etapa de búsqueda y coincidencia dentro de la canalización de agregación.

Conclusión

Las validaciones de documentos/esquemas no son necesarias ni deseables en todas las situaciones, pero generalmente es una buena práctica agregarlas a su base de datos, ya que aumentará la productividad de los desarrolladores que trabajan con su base de datos. Ellos sabrán qué tipo de respuesta esperar de la base de datos ya que no habrá datos aleatorios.

En este artículo, aprendimos sobre la importancia de la validación de esquemas en MongoDB y cómo agregar validaciones a nivel de documento utilizando la validación de documentos y el operador "jsonSchema".