Как видно из предыдущей главы отношений 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 —