English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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" }
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,db
yusers
Son 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.
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_ids
deuser
obtener campos, luego dedocumentos
Obtener 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"]}})