MongoDB虽然是非关系型数据库,但并不意味着MongoDB中的文档对象之间无法建立关系(当然这些对象之间也可以没有关系),建立关系的思想和关系型数据库大体一样,但也有不同的地方。
1、一对一
在MongoDB中可以通过内嵌文档的形式体现出一对一的关系,比如夫妻:
{
name:'黄蓉',
husband:{
name:'郭靖'
}
}
一个文档对象一旦被嵌入到另一个文档对象中就绝不可能再被嵌入到其他文档对象中,因此可以体现出一对一的关系
2、一对多或多对一(实际开发中最常用)
有两种方式可以体现一对多(或多对一)的关系,以客户和订单为例:
一:关系在一的一方维护,直接通过内嵌数组,在数组中放整个对象的方式:这种方式不好,因为如果对应的对象比较多的话,文档就会看起来很复杂,不易查询
{
cust_id:ObjectId("5d272c817f2dc9e6986d82fb"),
cust_name:"黑宋江",
orders:[
{
_id: ObjectId("5d2614c42b1a4fdfd82bfda3"),
type:"牛肉",
count:2
},
{
_id:ObjectId("5d272c817f2dc9e6986d82fa"),
type:"酒",
count:6
}
]
}
二:一对多,用户:constom/订单orders
1⃣️:先创建用户集合
db.constom.insert([
{username:'孙悟空'},
{username:'猪八戒'}
])
2⃣️:再创建订单集合(添加一个userid属性,该订单是谁的就给userid属性添加谁的_id)
db.orders.insert({
list:['橘子'],
userid:ObjectId("5ebcfe39bc5756d0fed31ff3")//这个是孙悟空的_id代表该订单就是孙悟空的。
})
3⃣️:通过userid再去查找每个人对应的订单
var userid = db.constom.findOne({username:'孙悟空'})._id;
db.orders.find({userid:userid})
3:多对多
老师–学生
首先插入一个老师的集合
db.teachers.insert([
{username:'英语老师'},
{username:'语文老师'},
{username:'数学老师'}
])
查询插入的结果:
db.teachers.find()
结果如下:
/* 1 */
{
"_id" : ObjectId("5ebded7dbc5756d0fed31ff7"),
"username" : "语文老师"
}
/* 2 */
{
"_id" : ObjectId("5ebded7dbc5756d0fed31ff8"),
"username" : "数学老师"
}
/* 3 */
{
"_id" : ObjectId("5ebdee7dbc5756d0fed31ff9"),
"username" : "英语老师"
}
再插入一个学生的集合
db.students.insert([
{
stuname:'cindy',
teacher:[
ObjectId("5ebded7dbc5756d0fed31ff7"),
ObjectId("5ebded7dbc5756d0fed31ff8")
]
},
{
stuname:'lily',
teacher:[
ObjectId("5ebded7dbc5756d0fed31ff7"),
ObjectId("5ebded7dbc5756d0fed31ff8"),
ObjectId("5ebdee7dbc5756d0fed31ff9")
]
}
])
查询一下学生的集合
db.students.find()
结果:
/* 1 */
{
"_id" : ObjectId("5ebdee96bc5756d0fed31ffa"),
"stuname" : "cindy",
"teacher" : [
ObjectId("5ebded7dbc5756d0fed31ff7"),
ObjectId("5ebded7dbc5756d0fed31ff8")
]
}
/* 2 */
{
"_id" : ObjectId("5ebdee96bc5756d0fed31ffb"),
"stuname" : "lily",
"teacher" : [
ObjectId("5ebded7dbc5756d0fed31ff7"),
ObjectId("5ebded7dbc5756d0fed31ff8"),
ObjectId("5ebdee7dbc5756d0fed31ff9")
]
}
得出结论:语文老师和数学老师都教过Lily和Cindy,Cindy有两个老师Lily有三个老师,这就是一个典型的多对多关系