MongoDB 數(shù)據(jù)庫引用

正如在MongoDB關(guān)系的最后一章中所看到的,為了在MongoDB中實現(xiàn)一個規(guī)范化的數(shù)據(jù)庫結(jié)構(gòu),我們使用了被引用關(guān)系的概念(也稱為手動引用),其中我們手動將被引用文檔的id存儲在其他文檔中。但是,在文檔包含來自不同集合的引用的情況下,我們可以使用MongoDB DBRefs。

DBRef與手動引用

作為示例場景,在我們將使用DBRef而不是手動引用的情況下,請考慮一個數(shù)據(jù)庫,在該數(shù)據(jù)庫中,我們將不同類型的地址(家庭,辦公室,郵件等)存儲在不同的集合中(address_home,address_office,address_mailing等)?,F(xiàn)在,當(dāng) user 集合的文檔引用地址時,它還需要根據(jù)地址類型指定要查找的集合。在文檔引用多個集合中的文檔的情況下,我們應(yīng)該使用DBRefs。

使用DBRef

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"
}
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清