MongoDB 快速入门指南:一对一、一对多、多对多文档对应
3.1 一对一
在 MongoDB 中,一对一关系可以体现在嵌入文档的形式如 Pair:
{
name:'黄蓉',
husband:{
name:'郭靖'
}
}
复制代码
一个文档对象一旦嵌入到另一个文档对象中,就不能再嵌入到其他文档对象中,因此可以体现一对一的关系
3.2 一对一to-many/many-to-one
一对多关系在实际开发中使用得非常多,也是现实世界中经常出现的关系。
有两种方式可以体现与客户的一对多(或多对一)关系。以顺序为例:
一:在一侧维护关系,直接通过嵌入矩阵,将整个对象存储在矩阵中:这种方法不好,因为如果对应的对象比较多,文档会显得很复杂,很难查询
{
cust_id:ObjectId("5d272c817f2dc9e6986d82fb"),
cust_name:"黑宋江",
orders:[
{
_id: ObjectId("5d2614c42b1a4fdfd82bfda3"),
type:"牛肉",
count:2
},
{
_id:ObjectId("5d272c817f2dc9e6986d82fa"),
type:"酒",
count:6
}
]
}
复制代码
二:一对多,user:constom/orders
例如,在一对多关系“user-order”中我们要查询一个特定用户。对于所有订单或者特定订单,我们可以给用户添加订单主键
先创建用户集合
db.constom.insert([
{username:'孙悟空'},
{username:'猪八戒'}
])
复制代码
然后创建订单集合(添加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多对多
在关系数据库中,我们处理多对多关系的方法一般是提取两个表的主键。将其放在单独的关系表中,并使用两个表的主键作为该关系表的外键。每次进行相关查询的时候,首先要在这个关系表中找到对应表的主键
MongoDB中的多对多其实和一对多
类似。它还利用添加一些冗余字段
来记录关系
例如我们是学生和老师常用的关系型数据库的例子。我们这里也用这个:
//多对多
// 先插入一些老师的信息
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
来源:稀土掘金
版权归作者所有。商业转载请联系作者获得许可。非商业转载请注明来源。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。