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

Referencias de bases de datos en MongoDB

Como se vio en el último capítulo sobre relaciones en MongoDB, para implementar una estructura de base de datos normalizada en MongoDB, hemos utilizado el concepto de relación referenciada (también conocida como referencia manual), donde almacenamos manualmente el id del documento referenciado en otros documentos. Sin embargo, cuando el documento contiene referencias a documentos de diferentes conjuntos, podemos usar MongoDB DBRefs.

DBRef vs Referencia Manual

Como ejemplo de escenario, consideremos una base de datos en la que almacenaremos diferentes tipos de direcciones (casa, oficina, correo, etc.) en diferentes conjuntos (address_home, address_office, address_mailing, etc.). Ahora, cuando el documento de la colección user hace referencia a una dirección, también necesita especificar la colección a buscar según el tipo de dirección. En el caso de que el documento referencie documentos de múltiples conjuntos, debemos usar DBRefs.

Uso de DBRef

Hay tres campos en DBRefs-

  • $ref −Este campo especifica la colección del documento de referencia

  • $id −Este campo especifica el campo _id del documento de referencia

  • $db −Este es un campo opcional que contiene el nombre de la base de datos donde se encuentra el documento al que se hace referencia

Consideremos un documento de usuario de ejemplo que tiene un campo DBRefaddressComo se muestra en el fragmento de código-

{
   "_id": ObjectId("53402597d852426020000002",
   "address": {
   "$ref": "address_home",
   "$id": "ObjectId("534009e4d852427820000002",
   "$db": "w"3codebox",
   "contact": ""987654321",
   "dob": "0"1-01-1991",
   "name": "Tom Benzamin"
}

El campo DBRef de esta dirección especifica que el documento de dirección se encuentra en w3En el conjunto address_home de la base de datos codebox, el campo id es534009e4d8524278200000002.

El siguiente código busca dinámicamente el documento de id especificado por el parámetro $id en la colección especificada por el parámetro $ref (en nuestro caso es address_home).

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

El código anterior devuelveaddress_homeLos siguientes documentos de dirección existentes en la colección-

{
   "_id": ObjectId("534009e4d852427820000002",
   "edificio": ""22 A, Indiana Apt",
   "codigo_postal": : 123456,
   "ciudad": "Los Ángeles",
   "estado": "California"
}