標籤:
MongoDB關係:
MongoDB 的關係表示多個文檔之間在邏輯上的相互聯絡。文檔間可以通過嵌入和引用來建立聯絡。
1. 內嵌關係:
形式:把一個文檔嵌入到另一個文檔中。
優點:資料儲存在單一的文檔中,可以比較容易的擷取和維護資料。(只需一次查詢)
缺點:如果資料量不斷變大,會影響讀寫效能。
使用樣本:
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Benzamin",
"address": [
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
}]
}
查詢樣本:
db.users.findOne({"name":"Tom Benzamin"},{"address":1})
2. 參考關聯性:
形式:通過文檔的id欄位來建立關係。
缺點:查詢時需要兩次查詢。
使用樣本:
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
查詢樣本:
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})
資料庫引用:當一個文檔需要從多個集合引用文檔時,應該使用DBRefs。
DBRefs的形式:
{ $ref : , $id : , $db : }
三個欄位表示的意義為:
$ref:集合名稱
$id:引用的id
$db:資料庫名稱,選擇性參數
使用樣本:
{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "w3cschoolcc"},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
}
查詢樣本:
>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})
MongoDB關係與資料庫引用