MongoDB數據庫引用
正如在上一章的介紹MongoDB關係,來在MongoDB實現一個規範化的數據庫結構 ,我們使用引用關係的概念,也被稱為手動參考,我們在其中手動存儲其他文檔引用文檔的ID。然而,在一些情況下文檔中包含來自不同的集合引用,我們可以使用MongoDB的DBRefs。
DBREFS VS 手動參考
作為一個示例場景,我們將使用DBRefs代替手動參考,考慮當我們要存儲不同類型的地址(家庭,辦公室,郵寄等)在不同的集合(address_home,address_office,address_mailing等)的數據庫。 現在,當用戶集合文檔引用地址,它也需要指定哪個集合來尋找到基於所述地址類型。在這種情況下,如果一個文檔要引用多個文檔集合,我們應該使用DBRefs。
使用DBRefs
在DBRefs有三個字段:
$ref: 此字段指定引用文檔的集合
$id: 此字段指定引用文檔的_id字段
$db: 這是一個可選字段,包含數據庫的名稱,其中所引用的文檔
請考慮示例用戶文檔有DBRef字段地址,如下圖所示:
{ "_id":ObjectId("53402597d852426020000002"), "address": { "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"), "$db": "yiibai"}, "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin" }
地址DBRef的字段在這裡指定引用地址文檔在address_home集合(在yiibai數據庫),並有一個ID: 534009e4d852427820000002.
下麵的代碼看起來動態的集合是通過$ref參數指定(address_home 在這個示例中) ID為一個文檔由DBRef 的 $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" }