Code前端首页关于Code前端联系我们

MongoDB 快速入门指南:一对一、一对多、多对多文档对应

terry 2年前 (2023-09-26) 阅读数 47 #数据库

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})
复制代码

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

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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门