BSON
- BSON是一种二进制序列化格式,用于在 MongoDB 中存储文档和进行远程过程调用
- 跟 JSON 的数据结构很像,但是支持更丰富的数据类型
数据类型
数据类型 | 序号 | 别名 | 备注 |
Double | 1 | double | |
String | 2 | string | |
Object | 3 | object | |
Array | 4 | array | |
Binary data | 5 | binData | |
Undefined | 6 | undefined | 弃用 |
ObjectId | 7 | objectId | |
Boolean | 8 | bool | |
Date | 9 | date | |
Null | 10 | null | |
Regular Expression | 11 | regex | |
DBPointer | 12 | dbPointer | 弃用 |
JavaScript | 13 | javascript | |
Symbol | 14 | symbol | 弃用 |
JavaScript code with scope | 15 | javascriptWithScope | 4.4 弃用 |
32-bit integer | 16 | int | |
Timestamp | 17 | timestamp | |
64-bit integer | 18 | long | |
Decimal128 | 19 | decimal | |
Min key | -1 | minKey | |
Max key | 127 | maxKey |
序号有什么用?
到时候想通过 $type 来指定某个数据类型的时候可以用序号,而不用敲完整的字符串
可以看到,通过 $type 来指定数据类型的时候,可以用别名,也可以用序号
ObjectId
ObjectId 很小,可能是唯一的,生成速度快,并且有序,ObjectId 值的长度为 12 个字节,包括
- 一个 4 字节的时间戳值,代表 ObjectId 的创建,以 Unix 纪元以来的秒数为单位
- 一个 5 字节的随机值
- 一个 3 字节递增计数器,初始化为随机值
给 _id 添加一个 ObjectId 的好处
- 对存储 ObjectId 值的 _id 字段进行排序大致相当于按创建时间排序
- 在 mongo shell 中,可以使用 ObjectId.getTimestamp() 方法访问 ObjectId 的创建时间
ObjectId("60b441609c297cd9d2ecf60f").getTimestamp() ISODate("2021-05-31T01:52:32Z")
String
- BSON 字符串是UTF-8
- 在序列化和反序列化 BSON 时,每种编程语言的驱动程序都会从该语言的字符串格式转换为 UTF-8
- 这使得在 BSON 字符串可以轻松存储大多数国际字
- 此外,MongoDB $regex 查询在 regex 字符串中支持 UTF-8
Timestamps
- BSON 有一个特殊的时间戳类型供内部 MongoDB 使用,并且与常规 Date 类型无关
- 此内部时间戳类型是一个 64 位值
- 前 32 位是 time_t 值(至 1970 年依赖的秒数),后 32 位是给定秒内操作的递增序数
- 在单个 mongod 实例中,时间戳值始终是唯一的
new Timestamp()
在插入包含具有空时间戳值的顶级字段的文档时,MongoDB将用当前时间戳值替换空时间戳值
db.myNewCollection1.insert({test:new timestamp()}) db.myNewCollection1.find() { "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
Date
BSON Date 是一个 64 位整数,表示自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数
在 shell 构造一个 date
var mydate1 = new Date()
在 mongo shell 中使用 ISODate() 构造函数构造一个 Date
var mydate2 = ISODate()
两种函数构造的 Date,值是同个类型的
以字符串形式返回日期值
mydate1.toString()
返回日期值的月份部分
月是零索引,因此一月是月0
mydate1.getMonth()
不同 BSON 数据类型的比较顺序
- MinKey (internal type)
- Null
- Numbers (ints, longs, doubles, decimals)
- Symbol, String
- Object
- Array
- BinData
- ObjectId
- Boolean
- Date
- Timestamp
- Regular Expression
- MaxKey (internal type)
后续再展开讲