Modelado One-To-One en MongoDB

Para realizar un modelado one to one en MongoDB vamos a utilizar el ejemplo Persona y Domicilio.

Una persona tendrá asociada la dirección de un domicilio. Estas entidades las modelaríamos de la siguiente manera:

Para el caso de la persona el documento JSON de ejemplo será:

{
  nombre: "Víctor Cuervo",
  edad: 38
}

Y para el caso del domicilio:

{
  calle: "Alcala, 15",
  codigo: 28022,
  ciudad: "Madrid"
}

Para resolver el modelado one-to-one tenemos dos estrategias posibles. La primera será la de embedding, es decir, incrustar la entidad Domicilio dentro de la entidad Persona. La segunda será la de linking, en este caso se usará una foreign key para mantener estas relaciones.

Modelado One-to-One Embedding en MongoDB

En este primer caso insertamos el domicilio en la colección de personas. Será un subdocumento dentro de la persona.

{
  nombre: "Víctor Cuervo",
  edad: 38,
  dirección: {
    calle: "Alcala, 15",
    codigo: 28022,
    ciudad: "Madrid"
  }
}

Para insertarlo:

var direccion = new Object(); 
direccion.calle = 'Alcala, 15' 
direccion.codigo = 28022 
direccion.ciudad = 'Madrid' 

var persona = new Object(); 
persona.nombre = 'Víctor Cuervo' 
persona.edad = 38 
persona.direccion = direccion 

db.personas.insert(persona);

Lo bueno de esta estrategia es que para recuperar el domicilio de una persona simplemente tendremos que realizar una única operación de consulta.

db.personas.find({ nombre: 'Víctor Cuervo'}, { direccion: 1});

Modelado One-to-One Linking en MongoDB

En este caso crearemos una clave dentro de la colección de personas y posteriormente la usaremos como foreign key dentro de la colección de domicilios.

El documento de la persona (user) tendrá un id:

{
  _id: 1,
  nombre: "Víctor Cuervo",
  edad: 38
}

Ese id será usado dentro del documento del domicilio (address):

{
  userid: 1,
  calle: "Alcala, 15",
  codigo: 28022,
  ciudad: "Madrid"
}

Para insertarlo:

var user = new Object(); 
user.nombre = 'Víctor Cuervo' 
user.edad = 38 
user._id = 1

var address = new Object(); 
address.calle = 'Alcala, 15' 
address.codigo = 28022 
address.ciudad = 'Madrid' 
address.userid = 1

db.users.insert(user);
db.addresses.insert(address);

Así para recuperar la información tendremos que realizar dos consultas. En la primera recuperaremos el id del usuario y con dicho id tendremos que acceder a la segunda colección a recuperar la colección:

var id = db.users.findOne({ nombre: 'Víctor Cuervo'}, { _id : 1});
db.addresses.find({ username: id._id });

El modelo linking será el más parecido a los modelos Entidad/Relación. Aunque es más apropiado aplicar una estrategia de embedding para el modelo de relaciones One-to-One en MongoDB

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada.