MongoDB - Relaciones

Las relaciones en MongoDB representan cómo varios documentos se relacionan lógicamente entre sí. Las relaciones se pueden modelar medianteEmbedded y Referencedenfoques. Tales relaciones pueden ser 1: 1, 1: N, N: 1 o N: N.

Consideremos el caso de almacenar direcciones para usuarios. Por lo tanto, un usuario puede tener varias direcciones, lo que hace que esta sea una relación 1: N.

A continuación se muestra la estructura del documento de muestra de user documento -

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

A continuación se muestra la estructura del documento de muestra de address documento -

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

Modelado de relaciones incrustadas

En el enfoque integrado, integraremos el documento de dirección dentro del documento del usuario.

> db.users.insert({
	{
		"_id":ObjectId("52ffc33cd85242f436000001"),
		"contact": "987654321",
		"dob": "01-01-1991",
		"name": "Tom Benzamin",
		"address": [
			{
				"building": "22 A, Indiana Apt",
				"pincode": 123456,
				"city": "Los Angeles",
				"state": "California"
			},
			{
				"building": "170 A, Acropolis Apt",
				"pincode": 456789,
				"city": "Chicago",
				"state": "Illinois"
			}
		]
	}
})

Este enfoque mantiene todos los datos relacionados en un solo documento, lo que facilita su recuperación y mantenimiento. El documento completo se puede recuperar en una sola consulta, como:

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

Tenga en cuenta que en la consulta anterior, db y users son la base de datos y la colección respectivamente.

El inconveniente es que si el documento incrustado sigue creciendo demasiado, puede afectar el rendimiento de lectura / escritura.

Modelado de relaciones referenciadas

Este es el enfoque para diseñar una relación normalizada. En este enfoque, tanto los documentos de usuario como los de dirección se mantendrán por separado, pero el documento de usuario contendrá un campo que hará referencia al documento de dirección.id campo.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

Como se muestra arriba, el documento de usuario contiene el campo de matriz address_idsque contiene ObjectIds de las direcciones correspondientes. Usando estos ObjectIds, podemos consultar los documentos de dirección y obtener detalles de la dirección desde allí. Con este enfoque, necesitaremos dos consultas: primero para obtener eladdress_ids campos de user documento y segundo para obtener estas direcciones de address colección.

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})