位置:首頁 > 數據庫 > MongoDB教學 > MongoDB關係

MongoDB關係

MongoDB中的關係代表文件如何在各種邏輯上彼此相關。關係可以通過嵌入和引用的方法來模擬。這樣的關係可以是 1:1, 1: N, N: 1 或 N: N.

讓我們考慮存儲用戶地址的情況(例子)。這樣,一個用戶可以有多個地址,那麼就成為一個 1:N 的關係。

下麵是用戶文件的示例文檔的結構:

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

下麵是地址文件的示例文檔結構:

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
} 

嵌入建模關係

在嵌入式方法中,我們將嵌入地址文件到用戶文檔中。

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }]
} 

這種方法保持在一個單一的文件,它可以很容易地檢索和維護所有相關數據。 整份文件,可檢索這樣一個查詢:

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

需要注意上麵的查詢,db和用戶分彆代表數據庫和集合。

缺點是,如果嵌入的文檔不斷增長過大,這會影響到讀/寫性能。

模型引用關係

這是設計標準化關係的方法。在這種方法中,用戶和地址的文件將被分彆維護,但用戶文檔將包含的字段將引用地址文檔的id字段。

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
} 

如上圖所示,用戶文檔包含數組字段address_ids,它包含相應地址的ObjectID。使用這些的ObjectID,我們可以查詢地址文檔,並從中獲得地址的詳細信息。通過這種方法,我們將需要兩個查詢:首先來從用戶文檔取出address_ids字段,再次從地址集合獲取這些地址。

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})