Post Top Ad

Your Ad Spot

lunes, 29 de junio de 2020

Tutorial de Relaciones con las Mangostas

Las bases de datos NoSQL como MongoDB funcionan de manera diferente a las bases de datos relacionales más antiguas y establecidas como MySQL, Oracle, Microsoft SQL, etc. Las relaciones en el sentido tradicional realmente no existen en MongoDB como lo hacen en MySQL. En este tutorial veremos cómo puede trabajar con datos relacionados, a pesar de que MongoDB no lo aplica explícitamente. Echaremos un vistazo a las relaciones basadas en referencias (normalización), así como a las relaciones de documentos incrustados (desnormalización).

Relaciones basadas en referencias (normalización)

En este enfoque, digamos que tenemos dos colecciones. Uno será para editores y otro será para juegos. Entonces, primero tendremos un objeto editor como ese.
Luego, tendremos otra colección para representar un juego. Entonces, en el objeto aquí, tenemos un juego que hace referencia a la identificación de un documento de editor.
Este es el enfoque de referencia. Se siente similar a cómo se podrían hacer las cosas en una base de datos relacional, pero hay una diferencia. En MongoDB, esta relación * no * se aplica, a diferencia de una base de datos relacional que impone la integridad de los datos en las relaciones. Aunque el documento del juego tiene una referencia a un documento del editor a través de una identificación, en MongoDB no existe una relación real entre estos dos documentos.

Relaciones de documentos incrustados (desnormalización)

El otro enfoque para las relaciones es incrustar un documento relacionado dentro de otro documento. Por ejemplo, podemos incrustar un documento de editor dentro de un documento de juego.
Entonces, ¿qué enfoque debes usar? Bueno, la normalización es realmente un enfoque de tipo de base de datos relacional. Si va a centrarse estrictamente en la normalización, una base de datos relacional podría ser la mejor opción. MongoDB no admite relaciones de clave externa del lado del servidor, a menudo se desaconseja la normalización. Es posible incrustar un objeto secundario dentro de un objeto primario si es posible, ya que esto aumenta el rendimiento y hace innecesarias las claves externas.

Normalización -> Mejor consistencia

  • Requiere consultas adicionales
  • Proporciona consistencia

Desormalización -> Mejor rendimiento

  • Puede usar una sola consulta para documentos relacionados
  • La consistencia puede degradarse con el tiempo.
También puede usar una combinación de estos dos enfoques en su aplicación, pero en general, si es posible, incrustará un objeto secundario dentro de un objeto primario.

Hacer referencia a un documento en otro documento

Comenzaremos con este código a continuación para comenzar.
Primero, creamos un editor en la base de datos. El editor es Nintendo, es cierto que son un editor propio y se proporciona la dirección del sitio web. También tenga en cuenta que una vez que el editor se inserta en la base de datos, se nos proporciona una identificación única para ese documento:5b2bdc233e939402b41d90bf
mongo-crud $ node index.js
Ahora conectado a MongoDB!
{_id: 5b2bdc233e939402b41d90bf,
  companyName: 'Nintendo', firstParty: true,
  sitio web: 'https://www.nintendo.com/',
  __v: 0}
Ahora que tenemos la identificación única para este editor en particular, podemos insertar un nuevo juego en la base de datos mientras especificamos un editor utilizando la identificación única de 5b2bdc233e939402b41d90bf como el segundo argumento aquí.
Ahora nuestro objetivo era crear un nuevo juego en la base de datos asociado con un editor. Parece que todo lo que tenemos es el título del juego para la salida aquí, parece que falta el editor.
mongo-crud $ node index.js
Ahora conectado a MongoDB!
{_id: 5b2bdca63c61aa362c25dc7b,
  título: 'Super Smash Bros', __v: 0}
Podemos arreglar esto modificando nuestro modelo de Juego para incluir un editor con su tipo establecido en mongoose.Schema.Types.ObjectId así.
Ahora, cuando insertamos un juego en la base de datos, vemos que se muestran tanto el título como el editor.
mongo-crud $ node index.js
Ahora conectado a MongoDB!
{_id: 5b2bdd5fd056be34c08986c2,
  título: 'Super Smash Bros', editor: 5b2bdc233e939402b41d90bf,
  __v: 0}
Si lo comprobamos en Compass, también vemos esto.
juegos en mongodb
Ahora queremos consultar la base de datos para ver nuestros juegos. La consulta aquí dice encontrar todos los juegos y seleccionar su título.
Ya vemos los dos juegos que insertamos.
mongo-crud $ node index.js
Ahora conectado a MongoDB!
[{_id: 5b2bdca63c61aa362c25dc7b, título: 'Super Smash Bros'},
  {_id: 5b2bdd5fd056be34c08986c2, título: 'Super Smash Bros'}]
También podemos seleccionar el editor simplemente incluyéndolo en la parte seleccionada de la consulta.
Ahora, cuando ejecutamos el programa, vemos el primer juego que no tiene editor, y también el segundo juego que está asociado con un editor gracias a nuestras actualizaciones de código justo arriba. Tenga en cuenta que el editor es simplemente la identificación única de 5b2bdc233e939402b41d90bf.
mongo-crud $ node index.js
Ahora conectado a MongoDB!
[{_id: 5b2bdca63c61aa362c25dc7b, título: 'Super Smash Bros'},
  {_id: 5b2bdd5fd056be34c08986c2, título: 'Super Smash Bros',
    editor: 5b2bdc233e939402b41d90bf}]
Por lo tanto, sería mejor ver los datos reales del editor en lugar de solo la identificación de identificación. Podemos hacer eso con el método populate () .
Ah ja! Ahora eche un vistazo a los datos que recuperamos.
mongo-crud $ node index.js
Ahora conectado a MongoDB!
[{_id: 5b2bdca63c61aa362c25dc7b, título: 'Super Smash Bros'},
  {_id: 5b2bdd5fd056be34c08986c2, título: 'Super Smash Bros',
    editor:
     {_id: 5b2bdc233e939402b41d90bf, companyName: 'Nintendo',
       firstParty: verdadero,
       sitio web: 'https://www.nintendo.com/', __v: 0}}]
Entonces, supongamos que solo desea ver el nombre de la empresa del editor, pero no todos los demás datos asociados del editor. Genial, solo actualiza tu llamada a populate () de esta manera.
Ahora tenemos lo que queremos.
mongo-crud $ node index.js
Ahora conectado a MongoDB!
[{_id: 5b2bdca63c61aa362c25dc7b, título: 'Super Smash Bros'},
  {_id: 5b2bdd5fd056be34c08986c2, título: 'Super Smash Bros',
    editor: {_id: 5b2bdc233e939402b41d90bf, companyName: 'Nintendo'}}]
Para limpiar las cosas un poco más, agreguemos el _id de la salida en la consulta -_id.
¡Agradable! Parece que está funcionando muy bien.
mongo-crud $ node index.js
Ahora conectado a MongoDB!
[{_id: 5b2bdca63c61aa362c25dc7b, título: 'Super Smash Bros'},
  {_id: 5b2bdd5fd056be34c08986c2, título: 'Super Smash Bros',
    editor: {companyName: 'Nintendo'}}]

Documentos incrustados en MongoDB

Ahora queremos ver cómo incrustar un documento dentro de otro documento en lugar de utilizar el enfoque de referencia. En la sección anterior, teníamos un documento del juego que hacía referencia a un documento de editor separado. Ahora, vamos a cambiar el código para que cuando se guarde un documento del juego, también incrustemos un documento de editor al mismo tiempo. Lo que puedes ver a continuación es que ahora estamos incorporando el editorSchema justo dentro del juegoSchema.
¡Excelente! Creemos un nuevo juego e incrustemos un editor en una sola toma.
Ah ja! Tenga en cuenta que el editor es un objeto y contiene todas las propiedades de un editor.
mongo-crud $ node index.js¡Ahora conectado a MongoDB!
{_id: 5b2bf100e588f40958a9b6e7,
  título: 'Rayman', editor:
   {_id: 5b2bf100e588f40958a9b6e6,
     companyName: 'Ubisoft', firstParty: false,
     sitio web: 'https://www.ubisoft.com/'},
  __v: 0}
Podemos ver claramente el documento del editor incrustado dentro del documento del juego en Compass. Estos se denominan documentos incrustados o "sub".
documento incrustado mongodb
Entonces, digamos que desea actualizar el editor, pero está incrustado en un juego. ¿Cómo podemos hacer eso? Tendría que encontrar el juego primero, luego actualizar el editor dentro del juego. Por último, guardarías el juego.
Ejecute la función en la terminal.
mongo-crud $ node index.js
Si revisamos el documento en Compass, podemos ver que ahora se actualiza con éxito.
actualizar el documento incrustado mongodb
También es posible actualizar un subdocumento directamente. Aquí está cómo hacer eso.
Ejecute la función en la terminal.
mongo-crud $ node index.js
Una vez más, Compass nos muestra que hemos actualizado con éxito el documento directamente en la base de datos.
actualizar subdocumento en mongodb

Eliminar un sub documento con unset

Para eliminar un sub documento, puede usar unset como así.
Ejecute la función en la terminal.
mongo-crud $ node index.js
Efectivamente, el sub documento ya no está en Compass.
eliminar subdocumento con mongodb sin configurar
Aquí hay algunas cosas para recordar sobre los subdocumentos.
  • Puede aplicar la validación en Subdocumentos.
  • Solo puede guardar un Subdocumento en el contexto del Documento principal.
  • No puede guardar un documento secundario por sí mismo.

Resumen Tutorial de Relaciones con las Mangostas

  • Para modelar las relaciones entre los datos conectados, puede hacer referencia a un documento o incrustarlo en otro documento como un sub documento.
  • Hacer referencia a un documento no crea una relación "real" entre estos dos documentos como lo hace con una base de datos relacional.
  • Hacer referencia a documentos también se conoce como normalización . Es bueno para la consistencia de los datos, pero crea más consultas en su sistema.
  • La incrustación de documentos también se conoce como desnormalización . El beneficio de este enfoque es obtener todos los datos que necesita sobre un documento y sus subdocumentos con una sola consulta. Por lo tanto, este enfoque es muy rápido. El inconveniente es que los datos pueden no ser tan consistentes en la base de datos.
  • Los ID de objeto son generados por el controlador MongoDB para identificar de manera única cada documento. Los ObjectIDs consisten en 12 bytes
    • 4 bytes: marca de tiempo
    • 3 bytes: identificador de la máquina
    • 2 bytes: identificador de proceso
    • 3 byes: contador
Para hacer referencia a un documento en Mongoose, puede usar mongoose.Schema.Types.ObjectId de esta manera.
El enfoque más común con las bases de datos NoSQL es incrustar un subdocumento como este.
Los documentos incrustados no tienen un método de guardar. Solo se pueden guardar a través de sus padres.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas