MongoDB關聯關係

MongoDB中的關係表示各個文檔在邏輯上的相互關聯。關係可以通過嵌入式和引用方法建模。 這種關係可以是1:11:NN:1N:N

假設有一種情況:要存儲用戶的地址。一個用戶可以擁有多個地址,這就是1:N關係。

以下是用戶(user)文檔示例的文檔結構 -

{
   "_id":10999110,
   "name": "Maxsu",
   "contact": "13888990021",
   "dob": "1992-10-11"
}

以下是地址(address)文檔的示例文檔結構 -

{
   "_id":12200,
   "building": "Hainan Building NO.2100",
   "pincode": 571100,
   "city": "Haikou",
   "province": "Hainan"
}

嵌入式關係建模

在嵌入式方法中,我們將地址(address)文檔嵌入到用戶(user)文檔中。

{
   "_id": 21000100,
   "contact": "13800138000",
   "dob": "1991-11-11",
   "name": "Maxsu",
   "address": [
      {
         "building": "Hainan Building NO.2100",
         "pincode": 571100,
         "city": "Haikou",
         "province": "Hainan"
      },
      {
         "building": "Sanya Building NO.2100",
         "pincode": 572200,
         "city": "Sanya",
         "province": "Hainan"
      },
   ]
}

該方法將所有相關數據保存在單個文檔中,這使得檢索和維護更容易。可以使用單個查詢來在整個文檔檢索,例如 -

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

請注意,在上述查詢中,dbusers分別是數據庫和集合。缺點是如果嵌入式文檔的大小如果不斷增長,可能會影響讀/寫性能。

建模參考關係

這是設計規範化關係的方法。 在這種方法中,用戶和地址文件將分別維護,但用戶文檔將包含一個將引用地址文檔的id字段的字段。

{
   "_id":ObjectId("52ffc33321332111sdfaf"),
   "contact": "13800138000",
   "dob": "1991-11-11",
   "name": "Maxsu",
   "address_ids": [
      ObjectId("123123"),
      ObjectId("123412")
   ]
}

如上所示,用戶文檔包含對應地址的ObjectId的數組字段address_ids。 使用這些ObjectIds,我們可以從那裏查詢地址文件並獲取地址詳細信息。 使用這種方法,需要兩個查詢:首先從用戶文檔獲取address_ids字段,然後從地址集中獲取這些地址。

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