MongoDB——文档对象间的关系

 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:当然也可以借鉴关系型数据库即建立中间关系对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值