English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Como visto no último capítulo sobre relações no MongoDB, para implementar uma estrutura de banco de dados normalizada no MongoDB, usamos o conceito de relação referenciada (também conhecido como referência manual), onde armazenamos manualmente o id do documento referenciado em outros documentos. No entanto, quando um documento contém referências a documentos de diferentes coleções, podemos usar MongoDB DBRefs.
Como cenário de exemplo, vamos considerar um banco de dados onde diferentes tipos de endereços (casa, escritório, correio, etc.) são armazenados em diferentes coleções (address_home, address_office, address_mailing, etc.). Agora, quando um documento da coleção user referenciar um endereço, ele também precisa especificar a coleção a ser pesquisada com base no tipo de endereço. Quando um documento referencia documentos em várias coleções, devemos usar 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 que contém o nome do banco de dados onde o documento referenciado está localizado
Considere um documento de usuário exemplo com um campo DBRefaddress
Como mostrado no trecho 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" }
O campo DBRef aqui especifica que o documento de endereço está localizado em w3No banco de dados codebox, na coleção address_home, o id é534009e4d8524278200000002.
O código abaixo busca dinamicamente o documento de id especificado pelo parâmetro $id no conjunto especificado pelo parâmetro $ref (no nosso exemplo, address_home).
>var user = db.users.findOne({"name":"Tom Benzamin"}) >var dbRef = user.address >db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
O código acima retornaaddress_home
Os seguintes documentos de endereço existem na coleção:-
{ "_id": ObjectId("534009e4d852427820000002", "building": ""22 A, Indiana Apt", "pincode": : 123456, "city": "Los Angeles", "state": "California" }