MongoDB快速上手指南:文檔間的對應關(guān)系一對一、一對多、多對多
3.1 一對一
在MongoDB中可以通過內(nèi)嵌文檔的形式體現(xiàn)出一對一的關(guān)系,比如夫妻:
javascript copyable" lang="JavaScript">{
name:'黃蓉',
husband:{
name:'郭靖'
}
}
復制代碼
一個文檔對象一旦被嵌入到另一個文檔對象中就絕不可能再被嵌入到其他文檔對象中,因此可以體現(xiàn)出一對一的關(guān)系
3.2 一對多/多對一
一對多的關(guān)系在實際開發(fā)中是非常常用的,也是現(xiàn)實世界中出現(xiàn)頻率比較高的關(guān)系
有兩種方式可以體現(xiàn)一對多(或多對一)的關(guān)系,以客戶和訂單為例:
一:關(guān)系在一的一方維護,直接通過內(nèi)嵌數(shù)組,在數(shù)組中存放整個對象的方式:這種方式不好,因為如果對應的對象比較多的話,文檔就會看起來很復雜,不易查詢
{
cust_id:ObjectId("5d272c817f2dc9e6986d82fb"),
cust_name:"黑宋江",
orders:[
{
_id: ObjectId("5d2614c42b1a4fdfd82bfda3"),
type:"牛肉",
count:2
},
{
_id:ObjectId("5d272c817f2dc9e6986d82fa"),
type:"酒",
count:6
}
]
}
復制代碼
二:一對多,用戶:constom/訂單orders
舉個例子, 比如“用戶-訂單”這個一對多的關(guān)系中, 我們想查詢某一個用戶的所有或者某個訂單, 我們可以在用戶中添加訂單的主鍵
先創(chuàng)建用戶集合
db.constom.insert([
{username:'孫悟空'},
{username:'豬八戒'}
])
復制代碼
再創(chuàng)建訂單集合(添加一個userid屬性,該訂單是誰的就給userid屬性添加誰的_id)
db.orders.insert({
list:["辣椒","花椒","油"],
userid:ObjectId("5ebcfe39bc5756d0fed31ff3")//這個是孫悟空的_id代表該訂單就是孫悟空的。
})
復制代碼
通過userid再去查找每個人對應的訂單
var userid = db.constom.findOne({username:'孫悟空'})._id;
db.orders.find({userid:userid})
復制代碼
3.3 多對多
在關(guān)系型數(shù)據(jù)庫中我們處理多對多關(guān)系的時候采用的方法一般是將兩張表的主鍵抽取出來,放到一張單獨的關(guān)系表中,將兩張表的主鍵作為這張關(guān)系表的外鍵,每次做關(guān)聯(lián)查詢的時候都要先到這張關(guān)系表中找出對應表的主鍵
在MongoDB中多對多采用的其實是類似與一對多
的情況,也是通過增加一些冗余的字段
來記錄關(guān)系
舉個例子,我們在關(guān)系型數(shù)據(jù)庫中一般會以學生和老師作為例子,這里同樣我們也舉這個:
//多對多
// 先插入一些老師的信息
db.teachers.insertMany([
{name:"洪七公"},
{name:"黃藥師"},
{name:"龜仙人"}
]);
db.teachers.find();
// 插入一些學生的信息,并且將老師的id進行記錄
db.students.insertMany([
{
name:"郭靖",
teachers_ids:[
ObjectId("5d7f018b162f56aeed8aedda"),
ObjectId("5d7f018b162f56aeed8aeddb"),
ObjectId("5d7f018b162f56aeed8aeddc")
]
},{
name:"黃蓉",
teachers_ids:[
ObjectId("5d7f018b162f56aeed8aedda"),
ObjectId("5d7f018b162f56aeed8aeddb"),
ObjectId("5d7f018b162f56aeed8aeddc")
]
}
]);
db.students.find();
作者:是小梁同學呀
鏈接:https://juejin.cn/post/7126746699527094303
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
版權(quán)聲明:
本站所有文章和圖片均來自用戶分享和網(wǎng)絡收集,文章和圖片版權(quán)歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系網(wǎng)站客服處理。