English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Уровень 2 учебник MongoDB

Уровень 1 учебник MongoDB

Ссылка на базу данных MongoDB

Как было показано в последней главе о关系的 MongoDB, чтобы реализовать структуру базы данных с нормализацией в MongoDB, мы используем концепцию ссылаемых отношений (также известную как ручная ссылка), где мы вручную храним идентификатор документа, на который ссылаются, в других документах. Однако, когда документ содержит ссылки на документы из различных коллекций, мы можем использовать MongoDB DBRefs.

DBRef и ручная ссылка

В качестве примера сценария рассмотрим базу данных, в которой мы храним различные типы адресов (домашний, офисный, почтовый и т.д.) в различных коллекциях (address_home, address_office, address_mailing и т.д.). Теперь, когда документ из коллекции user ссылаются на адрес, он также должен указать, какая коллекция должна быть использована для поиска. В случае, когда документ ссылается на документы из нескольких коллекций,我们应该 использовать DBRefs.

Использование DBRef

В 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"
}