Para la mayoría de los casos de uso de MongoDB, el modelo de datos desnormalizado almacena datos relacionados en un único En algunos casos, es necesario almacenar información relacionada en documentos separados, normalmente en diferentes colecciones o bases de datos.
Importante
Puedes utilizar el $lookup fase de pipeline para realizar un left outer join en una colección no particionada de la misma base de datos.
También puedes usar la $graphLookup etapa de la pipeline para unir una colección no fragmentada y realizar búsquedas recursivas.
Esta página describe procedimientos alternativos que preceden a las $lookup y $graphLookup etapas de la pipeline.
Las aplicaciones de MongoDB utilizan uno de dos métodos para relacionar documentos:
Las referencias manuales guardan el campo
_idde un documento en otro documento como referencia. La aplicación ejecuta una segunda query para devolver los datos relacionados. Estas referencias son simples y suficientes para la mayoría de los casos de uso.Las referencias abases de datos (DBRefs) permiten establecer conexiones entre documentos utilizando el valor del campo del primer documento, el nombre de la
_idcolección y, opcionalmente, el nombre de la base de datos, así como cualquier otro campo. Las referencias a bases de datos permiten hacer referencia a documentos almacenados en varias colecciones o bases de datos.
Para resolver las referencias a bases de datos (DBRefs), su aplicación debe realizar consultas adicionales para obtener los documentos referenciados. Algunos controladores de MongoDB proporcionan métodos auxiliares que resuelven las referencias a bases de datos en documentos, pero la resolución no es automática.
Las referencias a bases de datos (DBRefs) proporcionan un formato y un tipo comunes para representar las relaciones entre documentos. Este formato también ofrece una semántica común para representar los vínculos entre documentos cuando la base de datos interactúa con múltiples marcos de trabajo y herramientas.
A menos que tengas una razón convincente para utilizar DBRefs, utiliza referencias manuales en su lugar.
Referencias del manual
Segundo plano
Una referencia manual incluye el _id campo de un documento en otro. La aplicación puede entonces ejecutar una segunda consulta para resolver los campos referenciados según sea necesario.
Crea una referencia manual en la Interfaz de Usuario de MongoDB Atlas
Para crear una referencia manual en la interfaz de usuario de MongoDB Atlas, siga estos pasos:
En la interfaz de usuario de MongoDB Atlas, vaya a Clusters página para tu proyecto.
Si aún no se muestra, seleccione la organización que contiene su proyecto deseado en el menú Organizations de la barra de navegación.
Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.
En la barra lateral, haz clic en Clusters en la sección Database.
La página de clústeres se muestra.
Navega a la colección.
Para el clúster en que deseas añadir una referencia de base de datos, haz clic en Browse Collections.
En el panel de navegación izquierdo, seleccione la base de datos.
En el panel de navegación izquierdo, selecciona la colección. Este ejemplo hace referencia a una colección
places.
Agregue un documento en la people colección que haga referencia a la entrada places en.
En el panel de navegación izquierdo, selecciona otra colección. Este ejemplo hace referencia a una colección
people.Haga clic en Insert Document.
Haz clic en el ícono de vista JSON ({{}}).
Pega los siguientes datos en el documento:
{ "_id": { "$oid": "651aebeb70299b120736f443" }, "name": "Erin", "places_id": "651aea5870299b120736f442" "url": "bc.example.net/Erin" } Haga clic en Insert.
Cuando una query devuelve el documento de la colección
people, puedes, si es necesario, filtrar los resultados de la query de la colecciónplacespara el documento referenciado por el campoplaces_id.Para obtener más información sobre cómo ejecutar queries en MongoDB Atlas, consulta Ver, filtrar y ordenar documentos en la documentación de MongoDB Atlas.
Crea una referencia manual en el terminal
Considere la siguiente operación para insertar dos documentos, usando el campo _id del primer documento como referencia en el segundo documento:
original_id = ObjectId() db.places.insertOne({ "_id": original_id, "name": "Broadway Center", "url": "bc.example.net" }) db.people.insertOne({ "name": "Erin", "places_id": original_id, "url": "bc.example.net/Erin" })
Luego, cuando una query devuelva el documento de la colección people, puedes, si es necesario, realizar una segunda query para el documento al que hace referencia el campo places_id en la colección places.
Usar
Para casi todos los casos en los que desee almacenar una relación entre dos documentos, utilice referencias manuales. Son fáciles de crear y su aplicación puede resolverlas según sea necesario.
Las referencias manuales no incluyen los nombres de las bases de datos ni de las colecciones. Si los documentos de una sola colección se relacionan con documentos de más de una colección, considere usar DBRefs.
DBRefs
Segundo plano
Los DBRefs son una convención para representar un documento, en lugar de un tipo de referencia específico. Incluyen el nombre de la colección y, en algunos casos, el nombre de la base de datos, además del valor del campo _id.
Opcionalmente, DBRefs puede incluir cualquier número de campos adicionales. Los nombres de los campos adicionales deben cumplir con las reglas de nomenclatura de campos impuestas por la versión del servidor.
Formato
Los DBRefs tienen los siguientes campos:
$refEl campo
$refcontiene el nombre de la colección en que reside el documento referenciado.
$idEl campo
$idcontiene el valor del campo_iden el documento referenciado.
$dbOpcional.
Contiene el nombre de la base de datos en que se encuentra el documento referenciado.
Ejemplo
Los documentos DBRef se asemejan al siguiente documento:
{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }
Considere un documento de una colección que almacenó un DBRef en un campo creator:
{ "_id" : ObjectId("5126bbf64aed4daf9e2ab771"), // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId("5126bc054aed4daf9e2ab772"), "$db" : "users", "extraField" : "anything" } }
El DBRef en este ejemplo apunta a un documento en la colección creators de la base de datos users que tiene ObjectId("5126bc054aed4daf9e2ab772") en su campo _id. También contiene un campo opcional.
Nota
El orden de los campos en el DBRef es importante, y debe usar la secuencia anterior al utilizar un DBRef.
Soporte de controladores para DBRefs
Controlador | Soporte para DBRef | notas |
|---|---|---|
C | No es compatible | Puedes recorrer las referencias manualmente. |
C++ | No es compatible | Puedes recorrer las referencias manualmente. |
C# | Admitido | Consulte la página del controlador C# para obtener más información. |
Go | No es compatible | Puedes recorrer las referencias manualmente. |
Haskell | No es compatible | Puedes recorrer las referencias manualmente. |
Java | Admitido | Consulte la página del controlador Java para obtener más información. |
Node.js | Admitido | Consulte la página del controlador de Node.js para obtener más información. |
Perl | Admitido | Consulte la página del controlador Perl para obtener más información. |
PHP | No es compatible | Puedes recorrer las referencias manualmente. |
Python | Admitido | Consulte la página del controlador PyMongo para obtener más información. |
Ruby | Admitido | Consulte la página del controlador Ruby para obtener más información. |
Scala | No es compatible | Puedes recorrer las referencias manualmente. |
Usar
En la mayoría de los casos, utilice referencias manuales para conectar dos o más documentos relacionados. Si necesita hacer referencia a documentos de varias colecciones, considere usar DBRefs.