在上一節(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)。
我們將利用一個(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。
在 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"
}