BSON 结构分析
BSON 简介
BSON 全称是 Binary JSON, 和 JSON 很像,但是采用二进制格式进行存储。相比 JSON 有以下优势:
- 访问速度更快。BSON 会存储 Value 的类型,相比于明文存储,不需要进行字符串类型到其他类型的转换操作。以整型 12345678 为例,JSON 需要将字符串转成整型,而 BSON 中存储了整型类型标志,并用 4 个字节直接存储了整型值;
- 存储空间更低。还是以整型 12345678 为例,JSON 采用明文存储的方式需要 8 个字节,但是 BSON 对于 Int32 的值统一采用 4 字节存储,Long 和 Double 采用 8 字节存储。 当然这里说存储空间更低也分具体情况,比如对于小整型,BSON 消耗的空间反而更高;
- 数据类型更丰富。BSON 相比 JSON,增加了 BinData,TimeStamp,ObjectID,Decimal128 等类型。
BSON 存储格式
一条最简单的 BSON 文档,从前向后可以拆解成以下几个部分:
- 文档的总长度, 占 4 个字节;
- Value 类型,参考代码定义,占 1 个字节;
- Key 的 String 表示形式(Key 只能 String 类型),长度不固定,以 ‘\0’ 结尾,占 len(Key)+1 个字节;
- Value 的二进制存储,比如 Int32 占 4 字节,Long 和 Double 占 8 个字节等;
- 文档以 ‘\0’ 结尾,也就是在遍历 BSON 到末尾时,常见的 EOO(End Of Object),占 1 个字节;
紧凑格式的缺点
BSON 的存储格式非常紧凑,不同的键值对之间是无间隔存储。因此,修改 BSON 中的某一字段意味着需要组织处一个新的 BSON 对象。如果增加、删除或者修改了某个字段,要生成新 BSON 文档,而非在原有 BSON 文档上原地修改。
在使用 MongoDB 时,可以使用 JSON 格式来暂时存储数据以便在不同的程序模块之间传递。当数据需要插入 MongoDB 时,再将数据封存,转换为 BSON 格式。