鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ 數(shù)據(jù)庫(kù)引用
更新文檔
GridFS
Rockmongo 管理工具
Map Reduce
Java
創(chuàng)建備份
數(shù)據(jù)模型
創(chuàng)建數(shù)據(jù)庫(kù)
映射
查詢文檔
索引限制
ObjectId
刪除文檔
數(shù)據(jù)類型
高級(jí)索引
索引
優(yōu)勢(shì)
記錄排序
查詢分析
插入文檔
刪除集合
全文檢索
創(chuàng)建集合
概述
數(shù)據(jù)庫(kù)引用
覆蓋索引查詢
安裝環(huán)境
PHP
刪除數(shù)據(jù)庫(kù)
固定集合
關(guān)系
聚合
自動(dòng)增長(zhǎng)
復(fù)制
限制記錄
部署
分片
正則表達(dá)式
原子操作

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

在上一節(jié)中,我們使用引用關(guān)系實(shí)現(xiàn)了歸一化的數(shù)據(jù)庫(kù)結(jié)構(gòu),這種引用關(guān)系也被稱作手動(dòng)引用,即可以手動(dòng)地將引用文檔的 id 保存在其他文檔中。但在有些情況下,文檔包含其他集合的引用時(shí),我們可以使用數(shù)據(jù)庫(kù)引用(MongoDB DBRefs)。

數(shù)據(jù)庫(kù)引用 vs 手動(dòng)引用

我們將利用一個(gè)例子來(lái)展示如何用數(shù)據(jù)庫(kù)引用代替手動(dòng)引用。假設(shè)一個(gè)數(shù)據(jù)庫(kù)中存儲(chǔ)有多個(gè)類型的地址(家庭地址、辦公室地址、郵件地址,等等),這些地址保存在不同的集合中(address_home、address_office、address_mailing,等等)。當(dāng) user 集合的文檔引用了一個(gè)地址時(shí),它還需要按照地址類型來(lái)指定所需要查看的集合。這種情況下,一個(gè)文檔引用了許多結(jié)合的文檔,所以就應(yīng)該使用 DBRef。

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

在 DBRef 中有三個(gè)字段:

$ref 該字段指定所引用文檔的集合。
$id 該字段指定引用文檔的 -id 字段 $db 該字段是可選的,包含引用文檔所在數(shù)據(jù)庫(kù)的名稱。

假如在一個(gè)簡(jiǎn)單的 user 文檔中包含著 DBRef 字段 address,如下所示:

{
   "_id":ObjectId("53402597d852426020000002"),
   "address": {
   "$ref": "address_home",
   "$id": ObjectId("534009e4d852427820000002"),
   "$db": "tutorialspoint"},
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin"
}

數(shù)據(jù)庫(kù)引用字段 address 指定出,引用地址文檔位于 tutorialspoint 數(shù)據(jù)庫(kù)的 address_home 集合中,并且它的 id 為 534009e4d852427820000002

下例展示了,在由 $ref 所指定的集合(本例中為 address_home)中,如何動(dòng)態(tài)查找由 $id 所確定的文檔。

>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"
}
上一篇:ObjectId下一篇:數(shù)據(jù)類型