MongoDB中的關(guān)系表示各個(gè)文檔在邏輯上的相互關(guān)聯(lián)。關(guān)系可以通過(guò)嵌入式和引用方法建模。 這種關(guān)系可以是1:1,1:N,N:1或N:N。
假設(shè)有一種情況:要存儲(chǔ)用戶的地址。一個(gè)用戶可以擁有多個(gè)地址,這就是1:N關(guān)系。
以下是用戶(user)文檔示例的文檔結(jié)構(gòu) -
{
"_id":10999110,
"name": "Maxsu",
"contact": "13888990021",
"dob": "1992-10-11"
}
以下是地址(address)文檔的示例文檔結(jié)構(gòu) -
{
"_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"
},
]
}
該方法將所有相關(guān)數(shù)據(jù)保存在單個(gè)文檔中,這使得檢索和維護(hù)更容易??梢允褂脝蝹€(gè)查詢來(lái)在整個(gè)文檔檢索,例如 -
> db.users.findOne({"name":"Maxsu"},{"address":1, "name":1})
請(qǐng)注意,在上述查詢中,db和users分別是數(shù)據(jù)庫(kù)和集合。缺點(diǎn)是如果嵌入式文檔的大小如果不斷增長(zhǎng),可能會(huì)影響讀/寫(xiě)性能。
這是設(shè)計(jì)規(guī)范化關(guān)系的方法。 在這種方法中,用戶和地址文件將分別維護(hù),但用戶文檔將包含一個(gè)將引用地址文檔的id字段的字段。
{
"_id":ObjectId("52ffc33321332111sdfaf"),
"contact": "13800138000",
"dob": "1991-11-11",
"name": "Maxsu",
"address_ids": [
ObjectId("123123"),
ObjectId("123412")
]
}
如上所示,用戶文檔包含對(duì)應(yīng)地址的ObjectId的數(shù)組字段address_ids。 使用這些ObjectIds,我們可以從那里查詢地址文件并獲取地址詳細(xì)信息。 使用這種方法,需要兩個(gè)查詢:首先從用戶文檔獲取address_ids字段,然后從地址集中獲取這些地址。
>var result = db.users.findOne({"name":"Maxsu"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})