鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ MongoDB數(shù)據(jù)庫(kù)引用
MongoDB教程
MongoDB覆蓋查詢
MongoDB數(shù)據(jù)建模
MongoDB聚合
MongoDB更改用戶密碼和自定義數(shù)據(jù)
MongoDB用戶
MongoDB分片
MongoDB創(chuàng)建集合
MongoDB文本搜索
MongoDB數(shù)據(jù)類型
MongoDB GridFS
MongoDB索引限制
MongoDB插入文檔
MongoDB刪除集合
MongoDB數(shù)據(jù)庫(kù)引用
MongoDB復(fù)制
MongoDB Map Reduce
Python連接MongoDB操作
MongoDB原子操作
MongoDB特點(diǎn)
MongoDB安全檢查表
MongoDB排序記錄
MongoDB自動(dòng)遞增序列
MongoDB安裝配置(Windows)
MongoDB備份與恢復(fù)
MongoDB安裝配置(Ubuntu)
Ruby連接MongoDB操作
MongoDB部署
MongoDB索引
MongoDB分析查詢
MongoDB投影(選擇字段)
MongoDB刪除數(shù)據(jù)庫(kù)
MongoDB認(rèn)證
MongoDB限制記錄數(shù)
MongoDB添加用戶
MongoDB固定循環(huán)集合
MongoDB高級(jí)索引
MongoDB數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)
MongoDB快速入門
MongoDB創(chuàng)建數(shù)據(jù)庫(kù)
MongoDB啟用身份驗(yàn)證
MongoDB歷史
MongoDB管理用戶和角色
MongoDB安裝配置(RedHat/CentOS)
MongoDB刪除文檔
Java連接MongoDB操作
MongoDB正則表達(dá)式
MongoDB查詢文檔
MongoDB關(guān)聯(lián)關(guān)系
PHP連接MongoDB操作
MongoDB更新文檔
MongoDB ObjectId

MongoDB數(shù)據(jù)庫(kù)引用

如MongoDB關(guān)系的最后一章所示,要在MongoDB中實(shí)現(xiàn)規(guī)范化的數(shù)據(jù)庫(kù)結(jié)構(gòu),我們使用引用關(guān)系的概念,也稱為手動(dòng)引用,將引用的文檔的id手動(dòng)存儲(chǔ)在其他文檔中。 但是,如果文檔包含來(lái)自不同集合的引用,可以使用MongoDB DBRefs。

DBRefs vs 手動(dòng)參考

考慮一個(gè)示例場(chǎng)景,在這個(gè)場(chǎng)景中將使用DBRefs而不是手動(dòng)引用,設(shè)計(jì)有一個(gè)數(shù)據(jù)庫(kù)中將不同類型的地址(家庭,辦公室,郵件等)存儲(chǔ)在不同的集合(address_home,address_office,address_mailing等)中。 現(xiàn)在,當(dāng)用戶集合的文檔引用地址時(shí),還需要根據(jù)地址類型指定要查找的集合。 在這種情況下,文檔引用了多個(gè)集合中的文檔,則應(yīng)該使用DBRefs。

使用DBRefs

DBRefs中有三個(gè)字段 -

  • $ref - 此字段指定引用文檔的集合
  • $id - 此字段指定引用文檔的_id字段
  • $db - 這是一個(gè)可選字段,并包含引用文檔所在的數(shù)據(jù)庫(kù)的名稱

假設(shè)一個(gè)具有DBRef字段address的示例用戶文檔,如代碼片段所示 -

{
   "_id":ObjectId("348362491fjaskdlf2314"),
   "address": {
   "$ref": "address_home",
   "$id": ObjectId("sfaafdf4137832149fssa"),
   "$db": "yiibai"},
   "contact": "13800138000",
   "dob": "1991-12-12",
   "name": "Maxsu"
}

這里的 DBRef 字段 address指定引用的地址文件位于yiibai數(shù)據(jù)庫(kù)中的address_home集合中,其ID為sfaafdf4137832149fssa

以下代碼由$ref參數(shù)(在示例中為address_home)指定的集合中動(dòng)態(tài)地查找ID為DBRef中的$id參數(shù)指定的文檔。

>var user = db.users.findOne({"name":"Maxsu"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})

以上代碼返回address_home集合中存在的以下address文檔中 -

{
   "_id" : ObjectId("sfaafdf4137832149fssa"),
   "building" : "Hainan Apt No.2100",
   "pincode" : 571100,
   "city" : "Haikou",
   "province" : "Hainan"
}