前言
我们本节来看一下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的使用 下一节说监控 和 导入 导出