MongoDB快速上手指南:文档间的对应关系一对一、一对多、多对多

2022-08-0222:18:13数据库教程Comments1,114 views字数 1615阅读模式

3.1 一对一

MongoDB中可以通过内嵌文档的形式体现出一对一的关系,比如夫妻:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

{
    name:'黄蓉',
    husband:{
        name:'郭靖'
    }
}
复制代码

一个文档对象一旦被嵌入到另一个文档对象中就绝不可能再被嵌入到其他文档对象中,因此可以体现出一对一的关系文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

3.2 一对多/多对一

一对多的关系在实际开发中是非常常用的,也是现实世界中出现频率比较高的关系文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

有两种方式可以体现一对多(或多对一)的关系,以客户和订单为例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

一:关系在一的一方维护,直接通过内嵌数组,在数组中存放整个对象的方式:这种方式不好,因为如果对应的对象比较多的话,文档就会看起来很复杂,不易查询文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

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

二:一对多,用户:constom/订单orders文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

举个例子, 比如“用户-订单”这个一对多的关系中, 我们想查询某一个用户的所有或者某个订单, 我们可以在用户中添加订单的主键文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

先创建用户集合文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

db.constom.insert([
    {username:'孙悟空'},
    {username:'猪八戒'}
])
复制代码

再创建订单集合(添加一个userid属性,该订单是谁的就给userid属性添加谁的_id)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

db.orders.insert({
    list:["辣椒","花椒","油"],
    userid:ObjectId("5ebcfe39bc5756d0fed31ff3")//这个是孙悟空的_id代表该订单就是孙悟空的。
})
复制代码

通过userid再去查找每个人对应的订单文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

var userid = db.constom.findOne({username:'孙悟空'})._id;
db.orders.find({userid:userid})
复制代码

MongoDB快速上手指南:文档间的对应关系一对一、一对多、多对多文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

3.3 多对多

在关系型数据库中我们处理多对多关系的时候采用的方法一般是将两张表的主键抽取出来,放到一张单独的关系表中,将两张表的主键作为这张关系表的外键,每次做关联查询的时候都要先到这张关系表中找出对应表的主键文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

在MongoDB中多对多采用的其实是类似与一对多的情况,也是通过增加一些冗余的字段来记录关系文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

举个例子,我们在关系型数据库中一般会以学生和老师作为例子,这里同样我们也举这个:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

//多对多
// 先插入一些老师的信息
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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/26458.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/26458.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定