正如在MongoDB關(guān)系的最后一章中所看到的,為了在MongoDB中實現(xiàn)一個規(guī)范化的數(shù)據(jù)庫結(jié)構(gòu),我們使用了被引用關(guān)系的概念(也稱為手動引用),其中我們手動將被引用文檔的id存儲在其他文檔中。但是,在文檔包含來自不同集合的引用的情況下,我們可以使用MongoDB DBRefs。
作為示例場景,在我們將使用DBRef而不是手動引用的情況下,請考慮一個數(shù)據(jù)庫,在該數(shù)據(jù)庫中,我們將不同類型的地址(家庭,辦公室,郵件等)存儲在不同的集合中(address_home,address_office,address_mailing等)?,F(xiàn)在,當(dāng) user 集合的文檔引用地址時,它還需要根據(jù)地址類型指定要查找的集合。在文檔引用多個集合中的文檔的情況下,我們應(yīng)該使用DBRefs。
DBRefs中有三個字段-
$ref
?此字段指定引用文檔的集合
$id
?此字段指定引用文檔的_id字段
$db
?這是一個可選字段,包含所引用文檔所在的數(shù)據(jù)庫的名稱
考慮一個具有DBRef字段的示例用戶文檔,address
如代碼片段所示-
{ "_id":ObjectId("53402597d852426020000002"), "address": { "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"), "$db": "nhooo"}, "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin" }
這里的地址 DBRef 字段指定所引用的地址文檔位于 nhooo 數(shù)據(jù)庫下的 address_home 集合中,id 為534009e4d8524278200000002。
下面的代碼動態(tài)地在由$ref參數(shù)(在我們的實例中是address_home)指定的集合中查找由DBRef中的$id參數(shù)指定的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" }