MongoDB: referencias de bases de datos

Como se vio en el último capítulo de las relaciones de MongoDB, para implementar una estructura de base de datos normalizada en MongoDB, usamos el concepto de Referenced Relationships también conocido como Manual Referencesen el que almacenamos manualmente la identificación del documento referenciado dentro de otro documento. Sin embargo, en los casos en los que un documento contiene referencias de diferentes colecciones, podemos usarMongoDB DBRefs.

DBRefs vs referencias manuales

Como escenario de ejemplo, donde usaríamos DBRefs en lugar de referencias manuales, considere una base de datos donde estamos almacenando diferentes tipos de direcciones (hogar, oficina, correo, etc.) en diferentes colecciones (address_home, address_office, address_mailing, etc.). Ahora, cuando unuserEl documento de la colección hace referencia a una dirección, también necesita especificar qué colección buscar en función del tipo de dirección. En tales escenarios donde un documento hace referencia a documentos de muchas colecciones, deberíamos usar DBRefs.

Usando DBRefs

Hay tres campos en DBRefs:

  • $ref - Este campo especifica la colección del documento referenciado.

  • $id - Este campo especifica el campo _id del documento referenciado

  • $db - Este es un campo opcional y contiene el nombre de la base de datos en la que se encuentra el documento referenciado.

Considere un documento de usuario de muestra con un campo DBRef address como se muestra en el fragmento de código -

{
   "_id":ObjectId("53402597d852426020000002"),
   "address": {
   "$ref": "address_home",
   "$id": ObjectId("534009e4d852427820000002"),
   "$db": "tutorialspoint"},
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin"
}

los address El campo DBRef aquí especifica que el documento de dirección referenciado se encuentra en address_home colección bajo tutorialspoint base de datos y tiene una identificación de 534009e4d852427820000002.

El siguiente código busca dinámicamente en la colección especificada por $ref parámetro (address_home en nuestro caso) para un documento con id según lo especificado por $id parámetro en DBRef.

>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})

El código anterior devuelve el siguiente documento de dirección presente en address_home colección -

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