如MongoDB關係的最後一章所示,要在MongoDB中實現規範化的資料庫結構,我們使用參照關係的概念,也稱為手動參照,將參照的文件的id
手動儲存在其他文件中。 但是,如果文件包含來自不同集合的參照,可以使用MongoDB DBRefs。
考慮一個範例場景,在這個場景中將使用DBRefs而不是手動參照,設計有一個資料庫中將不同型別的地址(家庭,辦公室,郵件等)儲存在不同的集合(address_home
,address_office
,address_mailing
等)中。 現在,當使用者集合的文件參照地址時,還需要根據地址型別指定要查詢的集合。 在這種情況下,文件參照了多個集合中的文件,則應該使用DBRefs。
DBRefs中有三個欄位 -
$ref
- 此欄位指定參照文件的集合$id
- 此欄位指定參照文件的_id
欄位$db
- 這是一個可選欄位,並包含參照文件所在的資料庫的名稱假設一個具有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
資料庫中的address_home
集合中,其ID為sfaafdf4137832149fssa
。
以下程式碼由$ref
引數(在範例中為address_home
)指定的集合中動態地查詢ID為DBRef中的$id
引數指定的文件。
>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"
}