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
}
]
}
②关系在一的一方维护,数组中不直接放对象,而是放对象的_id,将order的文档对象放在另一个集合(collection)中,这样稍微好了一些
{
cust_id:ObjectId("5d272c817f2dc9e6986d82fb"),
cust_name:"黑宋江",
orders:[
ObjectId("5d2614c42b1a4fdfd82bfda3"),
ObjectId("5d272c817f2dc9e6986d82fa")
]
}
③关系在多的一方维护,即在order端维护,每一个order关联一个客户的_id
{
_id:ObjectId("5d272c817f2dc9e6986d82fa"),
type:"酒",
count:6,
cust_id:ObjectId("5d272c817f2dc9e6986d82fb"),
}
此时在查询客户下的订单时:
var cust_id = db.custs.findOne({cust_name:"黑宋江"})._id;
db.orders.find({cust_id:user_id});
3、多对多
可借鉴一对多中的②,只不过是在双方都存_id的数组
/*老师对象*/
{
_id:ObjectId("5d275f527f2dc9e6986d82fc"),
t_name:'张三丰',
stu_ids:[
ObjectId("5d272c817f2dc9e6986d82fb"),
ObjectId("5d272c817f2dc9e6986d82fa")
]
}
/*学生对象*/
{
_id:ObjectId("5d275f527f2dc9e6986d82fc"),
s_name:'张无忌',
t_ids:[
ObjectId("5d272c817f2dc9e6986d82fb"),
ObjectId("5d272c817f2dc9e6986d82fa")
]
}
Tip
:当然也可以借鉴关系型数据库即建立中间关系对象