3.1 一对一

在MongoDB中可以通过内嵌文档的形式体现出一对一的关系,比如夫妻:

javascript copyable" lang="JavaScript">{
    name:'黄蓉',
    husband:{
        name:'郭靖'
    }
}
复制代码

一个文档对象一旦被嵌入到另一个文档对象中就绝不可能再被嵌入到其他文档对象中,因此可以体现出一对一的关系

3.2 一对多/多对一

一对多的关系在实际开发中是非常常用的,也是现实世界中出现频率比较高的关系

有两种方式可以体现一对多(或多对一)的关系,以客户和订单为例:

一:关系在一的一方维护,直接通过内嵌数组,在数组中存放整个对象的方式:这种方式不好,因为如果对应的对象比较多的话,文档就会看起来很复杂,不易查询

{
    cust_id:ObjectId("5d272c817f2dc9e6986d82fb"),
    cust_name:"黑宋江",
    orders:[
        {
            _id: ObjectId("5d2614c42b1a4fdfd82bfda3"),
            type:"牛肉",
            count:2
        },
        {
            _id:ObjectId("5d272c817f2dc9e6986d82fa"),
            type:"酒",
            count:6
        }
    ]
}
复制代码

二:一对多,用户:constom/订单orders

举个例子, 比如“用户-订单”这个一对多的关系中, 我们想查询某一个用户的所有或者某个订单, 我们可以在用户中添加订单的主键

先创建用户集合

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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。