MongoDB - referências de banco de dados

Como visto no último capítulo de relacionamentos do MongoDB, para implementar uma estrutura de banco de dados normalizada no MongoDB, usamos o conceito de Referenced Relationships também conhecido como Manual Referencesno qual armazenamos manualmente o id do documento referenciado dentro de outro documento. No entanto, nos casos em que um documento contém referências de coleções diferentes, podemos usarMongoDB DBRefs.

DBRefs vs referências manuais

Como um cenário de exemplo, onde usaríamos DBRefs em vez de referências manuais, considere um banco de dados onde armazenamos diferentes tipos de endereços (casa, escritório, correspondência, etc.) em coleções diferentes (endereço_home, endereço_escritório, endereço_mailing, etc). Agora, quando umuserO documento da coleção faz referência a um endereço, ele também precisa especificar qual coleção procurar com base no tipo de endereço. Em tais cenários onde um documento faz referência a documentos de muitas coleções, devemos usar DBRefs.

Usando DBRefs

Existem três campos em DBRefs -

  • $ref - Este campo especifica a coleção do documento referenciado

  • $id - Este campo especifica o campo _id do documento referenciado

  • $db - Este é um campo opcional e contém o nome da base de dados em que se encontra o documento referenciado

Considere um exemplo de documento do usuário com o campo DBRef address conforme mostrado no snippet de código -

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

o address O campo DBRef aqui especifica que o documento de endereço referenciado está em address_home coleção sob tutorialspoint banco de dados e tem um id de 534009e4d852427820000002.

O código a seguir procura dinamicamente na coleção especificada por $ref parâmetro (address_home no nosso caso) para um documento com id conforme especificado por $id parâmetro em DBRef.

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

O código acima retorna o seguinte documento de endereço presente em address_home coleção -

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