English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Как было показано в последней главе о关系的 MongoDB, чтобы реализовать структуру базы данных с нормализацией в MongoDB, мы используем концепцию ссылаемых отношений (также известную как ручная ссылка), где мы вручную храним идентификатор документа, на который ссылаются, в других документах. Однако, когда документ содержит ссылки на документы из различных коллекций, мы можем использовать MongoDB DBRefs.
В качестве примера сценария рассмотрим базу данных, в которой мы храним различные типы адресов (домашний, офисный, почтовый и т.д.) в различных коллекциях (address_home, address_office, address_mailing и т.д.). Теперь, когда документ из коллекции user ссылаются на адрес, он также должен указать, какая коллекция должна быть использована для поиска. В случае, когда документ ссылается на документы из нескольких коллекций,我们应该 использовать DBRefs.
В DBRefs есть три поля-
$ref
−Это поле указывает на коллекцию ссылаемого документа
$id
−Это поле указывает на поле _id ссылаемого документа
$db
−Это необязательное поле, содержащее имя базы данных, в которой находится документ, на который ссылаются
Рассмотрим пример документа пользователя с полем DBRef,address
Как показано в фрагменте кода -
{ "_id": ObjectId("53402597d852426020000002"), "address": { "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"), "$db": "w3codebox"}, "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin" }
Адрес DBRef поля указывает на то, что документ адреса находится в коллекции address_home базы данных w3codebox, с идентификатором 534009e4d8524278200000002.
Ниже приведен код, который динамически выполняет поиск документа с идентификатором, указанным в параметре $id (в нашем примере это address_home), в集合е,指定的ом параметром $ref.
>var user = db.users.findOne({"name":"Tom Benzamin"}) >var dbRef = user.address >db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
Верхний код возвращаетaddress_home
Документы адреса, существующие в коллекции -
{ "_id": ObjectId("534009e4d852427820000002"), "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }