Post Top Ad

Your Ad Spot

viernes, 11 de septiembre de 2020

Tutorial de relaciones de mangosta

 Tutorial de relaciones de mangosta

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 no existen realmente en MongoDB como lo hacen en MySQL. En este tutorial veremos cómo puede trabajar con datos relacionados, aunque MongoDB no lo aplique explícitamente. Veremos las relaciones basadas en referencias (normalización), así como 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 para juegos. Así que primero tendremos un objeto de 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 del 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 aplica la integridad de los datos en todas 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 de 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 debería utilizar? Bueno, la normalización es realmente un enfoque de tipo de base de datos relacional. Si se va a centrar 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, por lo que a menudo se desaconseja la normalización. Si es posible, es más común incrustar un objeto secundario dentro de un objeto principal, ya que esto aumenta el rendimiento y hace que las claves externas no sean necesarias.


Normalización -> Mejor consistencia

  • Requiere consultas adicionales
  • Proporciona consistencia

Desormalización -> Mejor rendimiento

  • Puede utilizar una única 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, incrustará un objeto secundario dentro de un objeto principal si es posible.


Hacer referencia a un documento en otro documento

Comenzaremos con este código a continuación para comenzar.

Entonces, primero aquí, creamos un publicador en la base de datos. El editor es Nintendo, es cierto que es 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 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 solucionar esto modificando nuestro modelo de juego para incluir un editor con su tipo configurado 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 que busque todos los juegos y seleccione su título.

Vemos los dos juegos que ya 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, al ejecutar 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 obtenemos.

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: cierto,
       sitio web: 'https://www.nintendo.com/', __v: 0}}]

Entonces, digamos que solo desea ver el nombre de la empresa del editor, pero no todos los demás datos asociados del editor. Genial, solo actualice su llamada populate () así.

Ahora obtenemos 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, eliminemos el _id de la salida en la consulta agregando -_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 independiente. Ahora, vamos a cambiar el código para que cuando se guarde un documento del juego, también incrustemos un documento del editor al mismo tiempo. Lo que puede ver a continuación es que ahora estamos incorporando el PublisherSchema directamente dentro del gameSchema.

¡Excelente! Creemos un nuevo juego e integremos un editor de una sola vez.

¡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 de Publisher incrustado dentro del documento del Juego en Compass. Estos se conocen como documentos incrustados o "sub".
documento incrustado mongodb

Entonces, digamos que desea actualizar el editor, pero está integrado en un juego. ¿Cómo podemos hacer eso? Primero tendrías que encontrar el juego y 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 ha actualizado correctamente.
actualizar documento incrustado mongodb

También es posible actualizar un subdocumento directamente. Así es como se hace.

Ejecute la función en la terminal.

mongo-crud $ node index.js

Una vez más, Compass nos muestra que actualizamos con éxito el documento directamente en la base de datos.
actualizar subdocumento en mongodb


Eliminar un subdocumento con desarmado

Para eliminar un subdocumento, puede usar unset como tal.

Ejecute la función en la terminal.

mongo-crud $ node index.js

Efectivamente, el documento secundario ya no está en Compass.
eliminar subdocumento con mongodb desarmado

Aquí hay algunas cosas para recordar acerca de los subdocumentos.

  • Puede aplicar la validación en subdocumentos.
  • Solo puede guardar un subdocumento en el contexto del documento principal.
  • No puede guardar un subdocumento por sí solo.

Resumen del tutorial de relaciones de mangosta

  • Para modelar las relaciones entre los datos conectados, puede hacer referencia a un documento o incrustarlo en otro documento como un subdocumento.
  • Hacer referencia a un documento no crea una relación "real" entre estos dos documentos como ocurre con una base de datos relacional.
  • Hacer referencia a documentos también se conoce como normalización . Es bueno para la coherencia 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 tanto, este enfoque es muy rápido. El inconveniente es que es posible que los datos no sean tan consistentes en la base de datos.
  • Los ObjectID son generados por el controlador MongoDB para identificar de forma única cada documento. ObjectIDs constan de 12 bytes
    • 4 bytes: marca de tiempo
    • 3 bytes: identificador de máquina
    • 2 bytes: identificador de proceso
    • 3 byes: contador

Para hacer referencia a un documento en Mongoose, puede usar mongoose.Schema.Types.ObjectId así.

El enfoque más común con las bases de datos NoSQL es incrustar un documento secundario como tal.

Los documentos incrustados no tienen un método de guardado. 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