English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Relaciones MongoDB

Las relaciones en MongoDB representan las relaciones lógicas entre diferentes documentos. Las relaciones se pueden modelar mediante métodos de incrustación y referencia. Estas relaciones pueden ser1:1,1N:N, N:1o N:N.

Consideremos el caso de almacenar direcciones para los usuarios. Por lo tanto, un usuario puede tener múltiples direcciones, lo que forma1: Relación N:N.

A continuación, se muestra la estructura de ejemplo del documentouser-

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

A continuación, se muestra la estructura de ejemplo del documentodocumentos-

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

Establecer modelo de relación incrustada

En el método incrustado, embedemos el documento de dirección en el documento de 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 método guarda todos los datos relacionados en un solo documento, lo que hace que la recuperación y el mantenimiento sean más fáciles. Se puede recuperar todo el documento en una sola consulta, por ejemplo-

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

Notar en la consulta anterior que,dbyusersSon la base de datos y la colección.

La desventaja es que, si el tamaño de los documentos incrustados continúa creciendo demasiado, podría afectar la lectura/Escribir rendimiento.

Establecer modelo de relación de referencia

Este es el método de diseño de relaciones normalizadas. En este método, los documentos de usuarios y los documentos de dirección se mantendrán separados, pero los documentos de usuarios contendrán un campo de referencia al campo id del documento de dirección.

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

Como se muestra anteriormente, el documento de usuario contiene el campo de array address_ids, que contiene los ObjectId de los objetos de dirección correspondientes. Utilizando estos ObjectId, podemos consultar los documentos de dirección y obtener los detalles de la dirección desde allí. Con este método, necesitará dos consultas: primeroaddress_idsdeuserobtener campos, luego dedocumentosObtener estas direcciones en la colección.

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