位置:首頁 > 數據庫 > MongoDB教學 > MongoDB數據庫引用

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"
}