基本数据类型
| 数据类型 | 描述 |
|---|---|
| Double | 存储浮点值 |
| String | 必须是 UTF-8 编码的字符串 |
| Object | 用于嵌入文档 |
| Array | 存储数组 |
| Binary data | 存储二进制数据 |
| ObjectId | 12字节,一般作用于 _id |
| Boolean | 存储 true or false |
| Date | 64位整数,表示自Unix epoch以来的毫秒数。用于存储时间 |
| Null | 存储 Null 值 |
| 32-bit integer | 32 位整型,int |
| 64-bit integer | 64 位整型,long |
| Decimal128 | 存储 decimal |
| Timestamp | 64位, MongoDB 内部使用的数据类型 |
ObjectId
MongoDB 每个集合的文档都有一个 _id 字段,用于标识该文档在集合中的唯一性。
如果未主动设置 _id,MongoDB client 会用 ObjectId 赋值 _id。
在 MongoDB shell 中,输入
ObjectId()
输出为:
ObjectId("6627bdb6dcf351c55d07c83a")
以下为 ObjectId 生成规则
注: ObjectId 只是有递增的趋势,并非单调递增
ObjectId 有 2 个方法
ObjectId().getTimestamp()
获取 ObjectId 的时间戳,返回的是 ISO 格式的日期
ISODate("2024-04-23T14:08:47.000Z")ObjectId().toString()
获取 ObjectId 的 16进制字符串
6627c0efdcf351c55d07c843
在 MongoDB 官方文档介绍中,_id 使用 ObjectId() 有以下 2 个优点
- 可以通过
ObjectId().getTimestamp()获取文档的创建时间。 - 通过对
ObjectId进行排序,相等于对创建时间进行排序
个人看法:
- ObjectId 类似 MySQL 中的自增ID,一般不对外暴露。一般使用中,可以再生成一个供外部可见的唯一ID
- 在深度翻页中,可以和 MySQL 一样,将 ObjectId() 作为翻页的起点。 例如 db.test.find({_id:{$gt: new ObjectId("6627c422dcf351c55d07c845")}}).sort({_id:1}).skip(1).limit(10)
Date
MongoDB 中的 Date 类型,是 64位 的整型,表示自 Unix epoch 依赖的 毫秒数。
可以使用 new Date() 创建时间类型。
在 MongoDB 中,Date 均已 ISO 格式进行展示。
例如 ISODate("2024-04-23T14:47:32.805Z")
MySQL DateTime 类型与 MongoDB Date 类似。不过需要注意的是 MySQL DateTime 只能 精确到秒,无法精确到毫秒
Timestamp
Timestamp 是 MongoDB 内部使用的数据类型。不建议在开发中使用该数据类型。
它由 2 部分组成
从上面的结构得出,在单个 MongoDB 实例中,Timestamp 绝对是唯一的。
Timestamp 用于 MongoDB 中的复制、分片功能中,用于跟踪和确保数据的一致性。在执行 DML 语句时,MongoDB 会为每条 DML 语句生成 Oplog,Oplog 的 ts 字段就是 Timestamp 类型。