MongoDB中的關係表示各個文件在邏輯上的相互關聯。關係可以通過嵌入式和參照方法建模。 這種關係可以是1:1
,1:N
,N:1
或N: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})
請注意,在上述查詢中,db
和users
分別是資料庫和集合。缺點是如果嵌入式文件的大小如果不斷增長,可能會影響讀/寫效能。
這是設計規範化關係的方法。 在這種方法中,使用者和地址檔案將分別維護,但使用者文件將包含一個將參照地址文件的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"]}})