MongoDB – Relaciones

Las relaciones en MongoDB representan cómo los diferentes documentos se relacionan lógicamente entre sí. Las relaciones se pueden modelar usando Construido en y Enlace enfoques. Tales relaciones pueden ser 1: 1, 1: N, N: 1 o N: N.

Considere el caso de almacenar direcciones para usuarios. Por tanto, un usuario puede tener varias direcciones, lo que corresponde a una relación 1: N.

A continuación se muestra una estructura de documento de muestra Usuario documento –

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

A continuación se muestra una estructura de documento de muestra la dirección documento –

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

Modelado de relaciones en línea

Con el enfoque en línea, incrustaremos el documento de dirección dentro del documento personalizado.

> 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"
			}
		]
	}
})

Con este enfoque, todos los datos relacionados se almacenan en un solo documento, lo que facilita la recuperación y el mantenimiento. El documento completo se puede recuperar con una sola solicitud, por ejemplo:

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

Tenga en cuenta que en la consulta anterior db y usuarios es una base de datos y una colección, respectivamente.

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

Modelado de relaciones de referencia

Este es un enfoque para construir relaciones normalizadas. Con este enfoque, tanto los documentos personalizados como los de direcciones se admitirán por separado, pero el documento personalizado contendrá un campo que hará referencia al documento de direcciones. Identificación 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 personalizado contiene un campo de matriz address_ids que contiene los ObjectIds de las direcciones correspondientes. Usando estos ObjectIds, podemos solicitar documentos de dirección y recibir datos de dirección desde allí. Con este enfoque, necesitamos dos solicitudes: la primera en obtener address_ids campos de Usuario documento y segundo para obtener estas direcciones de la dirección colección.

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

🚫