BSON 是什么
MongoDB 作为一款流行的文档数据库,采用 BSON 格式来支持文档模型。
BSON 全称是 Binary JSON, 和 JSON 很像,但是采用二进制格式进行存储。相比 JSON 有以下优势:
- 访问速度更快。BSON 会存储 Value 的类型,相比于明文存储,不需要进行字符串类型到其他类型的转换操作。以整型 12345678 为例,JSON 需要将字符串转成整型,而 BSON 中存储了整型类型标志,并用 4 个字节直接存储了整型值。对于 String 类型,会额外存储 String 长度,这样解析操作也会快很多;
- 存储空间更低。还是以整型 12345678 为例,JSON 采用明文存储的方式需要 8 个字节,但是 BSON 对于 Int32 的值统一采用 4 字节存储,Long 和 Double 采用 8 字节存储。 当然这里说存储空间更低也分具体情况,比如对于小整型,BSON 消耗的空间反而更高;
- 数据类型更丰富。BSON 相比 JSON,增加了 BinData,TimeStamp,ObjectID,Decimal128 等类型。
MongoDB 官方文档 对此有比较权威直观的描述,总结如下:
| JSON | BSON |
---|---|---|
编码方式 | UTF-8 String | Binary |
数据类型 | String, Boolean, Number, Array | String, Boolean, Number (Integer, Float, Long, Decimal128...), Array, Date, Raw Binary |
可读性 | Human and Machine | Machine Only |
本文将对 BSON 的存储格式进行深入分析,并从代码级别分析 BSON 的存储和解析过程,使大家对 BSON 有更深入的了解。
BSON 存储格式
一条最简单的 BSON 文档,从前向后可以拆解成以下几个部分:
- 首先是文档的总长度, 占 4 个字节;
- 然后是多个
BSONElement
按照顺序排列。每个BSONElement
包含的内容有:- 2.1 Value 类型,参考代码定义,占 1 个字节;
- 2.2 Key 的 C-String 表示形式,只存储 C-String内容,不存储长度,以 '