Как видно из предыдущей главы отношений MongoDB, для реализации нормализованной структуры базы данных в MongoDB мы используем концепцию ссылочных отношений, также называемых ручными ссылками, в которой мы вручную сохраняем идентификатор ссылочного документа внутри другого документа. Однако в тех случаях, когда документ содержит ссылки из разных коллекций, мы можем использовать MongoDB DBRefs .
DBRefs vs Руководство Ссылки
В качестве примера сценария, где мы будем использовать DBRef вместо ссылок вручную, рассмотрим базу данных, в которой мы храним различные типы адресов (домашний, офисный, почтовый и т. Д.) В разных коллекциях (address_home, address_office, address_mailing и т. Д.). Теперь, когда документ пользовательской коллекции ссылается на адрес, он также должен указать, какую коллекцию следует просматривать на основе типа адреса. В таких случаях, когда документ ссылается на документы из многих коллекций, мы должны использовать DBRef.
Использование DBRefs
В DBRefs есть три поля —
- $ ref — это поле указывает коллекцию ссылочного документа
- $ id — это поле указывает поле _id ссылочного документа
- $ db — это необязательное поле и содержит имя базы данных, в которой находится ссылочный документ
$ ref — это поле указывает коллекцию ссылочного документа
$ id — это поле указывает поле _id ссылочного документа
$ db — это необязательное поле и содержит имя базы данных, в которой находится ссылочный документ
Рассмотрим пример пользовательского документа с адресом поля DBRef, как показано во фрагменте кода —
{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "tutorialspoint"},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
}
Поле адреса DBRef здесь указывает, что указанный адресный документ находится в коллекции address_home базы данных tutorialspoint и имеет идентификатор 534009e4d852427820000002.
Следующий код динамически ищет в коллекции, указанной параметром $ ref (в нашем случае address_home ), документ с идентификатором, указанным параметром $ id в DBRef.
>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id"🙁dbRef.$id)})
Приведенный выше код возвращает следующий адресный документ, присутствующий в коллекции address_home —