Skip to content

5 Relaciones entre documentos

Introducción

MongoDB utiliza 2 métodos o patrones que nos van a permitir establecer la estructura de los documentos y sus relaciones. Vamos a ver cómo como son las relaciones entre documentos comparándolas con el modelo relacional.

Referencias Manuales

Este método consiste en almacenar el campo _id de un documento como referencia de un documento. Este método es similar al concepto de clave ajena del modelo relacional.

En el modelo relacional se debe realizar una segunda consulta para devolver los datos relaciones. Este es el método más utilizado.

Por ejemplo, creamos la colecciones emple y depart, cada elemento con su _id credo manualmente. Tenemos en cuenta que es como si fuese una relación 1:N, es decir, un departamento puede tener varios empleados.

db.emple.insertMany([
    {_id: "emp1", nombre: "Juan", salario: 1000, fechaalta: "10/10/199"},
    {_id: "emp2", nombre: "Alicia", salario: 1400, fechaalta: "07/08/2000", oficio: "Profesora"},
    {_id: "emp3", nombre: "María Jesús", salario: 1500, fechaalta: "05/01/2005", oficio: "Analista", comision: 100},
    {_id: "emp4", nombre: "Alberto", salario: 1100, fechaalta: "15/11/2001"}
])

En la colección depart, con dos departamentos, asignamos los dos primeros empleados al primer departamento, y los dos siguientes al segundo. Para asignar los empleados ponemos el nombre de la colección y entre corchetes dentro de un array de referencias los _id de los empleados a incluir, por ejemplo emple:['emp1', 'emp2']

db.depart.insertMany([
    {_id:'dep1', nombre: 'Informática', loc: 'Madrid', emple:['emp1', 'emp2']},
    {_id: 'dep2', nombre: "Gestión", loc: "Talavera", emple: ['emp3', 'emp4']}
])

Para visualizar los datos de la combinación de las colecciones necesitaremos hacer dos consultas, una para obtener el departamento a consultar, y la otra para obtener los empleados de ese departamento, que están dentro del array del departamento. Por ejemplo, se desea visualizar los empleados del departamento con identificativo _id igual a dep1

Para ello primero cargamos el departamento con _id:dep1 en una variable, utilizamos el método findOne. Dicho método siempre incluye el campo __id incluso si el campo no se especifica explícitamente en el parámetro de consulta:

departrabajo = db.depart.findOne({_id: 'dep1'})

Después recuperamos los empleados cuyo _id se encuentre enlazado a este departamento

emplesdep = db.emple.find({_id: {$in: departrabajo.emple}})

Podemos añadir el método toArray() los datos se devuelven en una matriz que contiene todos los documentos de la consulta, es decir, devuelve un array de documentos:

emplesdep = db.emple.find({_id: {$in: departrabajo.emple}}).toArray()

Ahora vamos a obtener los empleados del departamento 2 cuyo salario sea mayor de 1400

departrabajo = db.depart.findOne({_id: 'dep2'})
emplesdep = db.emple.find({_id: { $in: departrabajo.emple}, salario: {$gt: 1400}}).toArray()

DBRefs

Son referencias de un documento a otro utilizando el valor del campo _id del primer documento, el nombre de la colección y, opcionalmente, el nombre de la base de datos. Con la inclusión de estos nombres, los DBRefs permiten que documentos que se encuentran en varias colecciones sean vinculados para ser documentos de una sola colección.

Los DBRefs proporcionan en esencia una semántica común para la representación de los vínculos entre documentos. Los DBRefs también requieren consultas adicionales para devolver los documentos de referencia.

Ejercicio

Crea la colección sucursales y cuentas y realiza las siguientes consultas:

  • Visualiza las cuentas de las sucursales de Madrid.
  • Visualiza las cuentas son saldohaber > 10000 cuyo director sea Fernando Rato.
  • Sube 300 el saldohaber de las cuentas de la sucursal con código SUCI