Definir un esquema en MongoDB

Tahseen Tauseef 15 febrero 2024
  1. Esquema en MongoDB
  2. Consideraciones en el diseño de un esquema en MongoDB
  3. Definir un esquema en MongoDB
  4. Hacer cumplir un esquema utilizando MongoDB Realm
Definir un esquema en MongoDB

Este artículo discutirá el esquema MongoDB y cómo definirlo.

Esquema en MongoDB

La estructura y el contenido de sus datos están definidos por un esquema, que es un objeto JSON. Los esquemas BSON de Realm, que amplían el estándar JSON Schema, se pueden usar para diseñar el modelo de datos de su aplicación y validar documentos siempre que se creen, modifiquen o eliminen.

En lugar de valores precisos, los esquemas representan diferentes tipos de datos. Realm admite muchos tipos de esquemas integrados. Los elementos primitivos, como textos, números y tipos estructurales, como objetos y matrices, se pueden combinar para formar esquemas que representen tipos de objetos personalizados.

Por ejemplo, a continuación se proporciona un esquema básico para datos sobre automóviles y algunos objetos de automóvil que se ajustan al esquema.

Esquema:

{
  "title": "car",
  "required": [
    "_id",
    "year",
    "make",
    "model",
    "kilometers"
  ],
  "properties": {
    "_id": { "bsonType": "objectId" },
    "year": { "bsonType": "string" },
    "make": { "bsonType": "string" },
    "model": { "bsonType": "string" },
    "kilometers": { "bsonType": "number" }
  }
}

Objetos:

{
  "_id": ObjectId("5af712eff26b29dc5c51c60f"),
  "year": "2022",
  "make": "Honda",
  "model": "Civic",
  "kilometers": 123
}
{
  "_id": ObjectId("5af714eff24b294c5251cf04"),
  "year": "2016",
  "make": "Honda",
  "model": "City",
  "kilometers": 135794
}

Los esquemas son las especificaciones del modelo de datos para su aplicación. Realm le brinda herramientas y servicios adicionales para trabajar con datos que se ajustan al esquema una vez que lo haya definido.

Muchos servicios de aplicaciones en Realm utilizan esquemas:

  1. Para sincronizar datos entre dominios y MongoDB Atlas, Realm Sync emplea esquemas. Según sus esquemas, también puede desarrollar modelos de objetos SDK idiomáticos para usted.
  2. La API GraphQL emplea automáticamente esquemas para generar un esquema GraphQL que incluye automáticamente tipos, consultas y mutaciones. Los solucionadores personalizados que hacen referencia a los tipos definidos por sus esquemas se pueden agregar a la API de su aplicación.
  3. Antes y después de cada solicitud, las reglas de acceso a datos garantizan que los datos se ajusten a su esquema. Además, Realm previene o revierte toda la solicitud si algún documento falla en la validación.

Consideraciones en el diseño de un esquema en MongoDB

  1. Diseñe su esquema de acuerdo con los requisitos del usuario.
  2. Si usa los objetos juntos, combínelos en un solo documento. Sepárelos si es necesario (pero asegúrese de que no sea necesario unirlos).
  3. Duplicar los datos (pero de forma limitada) porque el espacio en disco es más económico que el tiempo de cómputo.
  4. Haz uniones mientras escribes, no mientras lees.
  5. Optimice su esquema para los casos de uso más frecuentes.
  6. Realice agregaciones complejas en el esquema.

Un ejemplo para explicar esto se da a continuación:

Suponga que un cliente necesita un diseño de base de datos para su blog o sitio web y ve las diferencias entre el diseño de esquema RDBMS y MongoDB. El sitio web tiene los siguientes requisitos.

  1. Cada publicación tiene un título, una descripción y una URL únicos.
  2. Cada publicación puede tener una o varias etiquetas.
  3. Cada publicación tiene el nombre del editor y el número total de Me gusta.
  4. Cada publicación incluye comentarios de los usuarios y su nombre, mensaje, tiempo de datos y Me gusta.
  5. En cada publicación, puede haber ninguno o más comentarios.

En el esquema RDBMS, el diseño para los requisitos anteriores tendrá un mínimo de tres tablas.

Diseño de esquema RDBMS

Mientras esté en el esquema MongoDB, el diseño tendrá una publicación de colección y la siguiente estructura:

{
  _id: POST-ID
  title: TITLE-OF-POST,
  description: POST-DESCRIPTION,
  by: POST-BY,
  url: URL-OF-POST,
  tags: [TAG1, TAG2],
  likes: TOTAL-LIKES,
  comments: [
    {
        user: 'COMMENT-BY',
        message: TEXT,
        dateCreated: DATE-TIME,
        like: LIKES
    },
    {
        user: 'COMMENT-BY',
        message: TEXT,
        dateCreated: DATE-TIME,
        like: LIKES
    }
  ]
}

Entonces, en RDBMS, debe combinar tres tablas para mostrar los datos; sin embargo, en MongoDB, los datos solo se muestran de una colección.

Definir un esquema en MongoDB

Se pueden encontrar esquemas adicionales que especifican los atributos del tipo en un esquema de colección de nivel raíz. Cada esquema de nivel raíz es un esquema de objeto, que se ve así:

{
  "bsonType": "object",
  "title": "<Type Name>",
  "required": ["<Required Field Name>", ...],
  "properties": {
    "<Field Name>": <Schema>
  }
}

El usuario puede utilizar cualquiera de los siguientes tipos de esquema admitidos para configurar las propiedades del objeto:

  1. Objeto
  2. matriz
  3. Cuerda
  4. booleano
  5. Id. de objeto
  6. Datos binarios
  7. Mixto
  8. conjunto
  9. Diccionario

Hacer cumplir un esquema utilizando MongoDB Realm

MongoDB Realm valida todas las operaciones de escritura (inserciones, actualizaciones y eliminaciones) en una colección MongoDB contra el esquema de la colección.

También examina cada documento antes y después de cada solicitud para garantizar que todas las propiedades sean coherentes con el esquema y que no se realicen cambios no válidos.

Antes de enviar las operaciones de escritura a su clúster, Realm verifica los resultados de todas las escrituras de documentos y los compara con el esquema.

MongoDB Realm envía un error al usuario si el resultado de cualquier operación de escritura en una solicitud no se ajusta al esquema sin realizar ningún cambio en la solicitud.

Un ejemplo de esto se da a continuación. Una colección tiene el siguiente esquema:

{
  "title": "person",
  "properties": {
    "_id": {"bsonType": "objectId" },
    "name": {"bsonType": "string" }
    }
}

Un usuario con acceso completo a todos los campos desea cambiar el campo nombre en un documento específico. Consultan sobre lo siguiente:

collection.updateOne(
  { "_id": BSON.ObjectId("5ae782e48f25b9dc5c51c4d0") },
  { "$set": { "name": 22 } }
)

La consulta intenta establecer el valor de nombre en el número 22. A pesar de esto, el esquema especifica que el valor es una cadena.

Incluso si el usuario recibiera autorización para actualizar el documento, MongoDB Realm rechazaría esta operación de escritura porque el resultado de la escritura no se adhiere al esquema.