Mongodb数据库教程第九节 - ObjectId 和 文档关系

本文档介绍了MongoDB中的ObjectId,它是一个12字节的BSON类型数据,常作为默认的_id键用于唯一标识文档。此外,还讨论了MongoDB中不同类型的文档关系,如一对一、一对多、多对一和多对多,并举例说明如何通过ObjectId建立和表示这些关系。
摘要由CSDN通过智能技术生成

博主个人主页

前言

我们本节来看一下Mongodb中的ObjectId

  • ObjectId 是一个12字节 BSON 类型数据

MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。
在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。

开始

创建ObjectId

$ ObjectId()

ObjectId("5349b4ddd2781d08c09890f3")

获取时间戳

ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

转为字符串

new ObjectId().str

5349b4ddd2781d08c09890f3
文档关系

MongoDB 的关系表示多个文档之间在逻辑上的相互联系 就类似与关系型数据库的链表 都有一定的关系存在 说的是NOSQL但是 其实集合与集合文档与文档还是会有一定的映射关系的

对应的关系可以是

  • 一对一 (one to one)
  • 一对多 (one to many)
  • 多对一 (many to one )
  • 多对多 (many to many)

一对一

例如 一个人只有一个身份证 一个男人只有一个妻子 那么在集合中如何表示呢

我们可以这样 表示

  • 一个记录对应一个
{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "idcard": "41032920000000000" 
} 
  • 如果需要拆开呢 两个集合 那么我们可以将用户的ObjectId当作另一个集合的属性 就类似关系型数据库的外键

一对多

例如 一个用户可以有多个订单 一个用户可以有很多收货地址

我们可以这样表示 嵌入式关系

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "jobs",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }]
} 
  • 如果拆分开呢 还是使用用户的ObjectId作为地址集合的外键和用户集合关联

多对一

  • 其实就是一对多。。。。 没什么不一样 反过来思考就好
  • 例如 有10个订单是同一个用户的

就省略了

多对多

  • 例如 一个教师可以有很多学生 一个学生可以有很多教师

我们可以先使用两个集合 一个集合是 学生 集合 一个集合是老师集合

我们还是来使用嵌入式关系表示 并且搭配ObjectId

老师集合

{
    "_id": ObjectId("5d6fdc75d3276405940068d8"),
    "tname": "小天",
    "stus": [
        ObjectId("5d6fdc45d3276405940068d6"),
        ObjectId("5d6fdc45d3276405940068d7")
    ]
}

学生集合

// 2
{
    "_id": ObjectId("5d6fdc45d3276405940068d7"),
    "name": "zs",
    "teacherId": [
        ObjectId("5d6fdb80d3276405940068d4"),
        ObjectId("5d6fdb80d3276405940068d5")
    ]
}

查询 小天老师有几个学生

var teacher = db.teachers.findOne({tname:"小天"});

teacher._id;

db.students.find({teacherId:{$all:[teacher._id]}});
// 1
{
    "_id": ObjectId("5d6fdd0fd3276405940068d9"),
    "name": "lwx",
    "teacherId": [
        ObjectId("5d6fdc75d3276405940068d8"),
        ObjectId("5d6fdb80d3276405940068d3")
    ]
}

// 2
{
    "_id": ObjectId("5d6fdd0fd3276405940068da"),
    "name": "zs",
    "teacherId": [
        ObjectId("5d6fdc75d3276405940068d8"),
        ObjectId("5d6fdb80d3276405940068d5")
    ]
}

查询 zs 有几个老师

var stu = db.students.findOne({name:"zs"});

stu._id;

db.teachers.find({stus:{$all:[stu._id]}});

结语

这一节简单的说了一下 文档间的关系和ObjectId的使用 下一节说监控 和 导入 导出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值