如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。
考慮一個(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中有三個(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"
}