什么是BSON(Binary JSON)存储

AI解读 2个月前 硕雀
85 0

BSONBinary JSON)概述

BSON 是一种 二进制形式的文档存储格式,最初由 MongoDB 在 2009 年设计,用于在数据库内部以及网络传输中高效地保存和交换类 JSON(JSON‑like)的数据结构。它在保持 JSON 可读性和层次结构的同时,引入了二进制编码和额外的数据类型,使得 序列化/反序列化速度更快、存储空间更易预测


1. BSON 的基本结构与数据类型

  • 文档(Document)‍:由一个 4 字节的整体长度字段、若干 BSONElement(键‑值对)以及一个结束标记(0x00)组成。
  • 键(Key)‍:采用 C‑style 的 cstring(以空字符结尾),因此键名本身会占用一定字节。
  • 值(Value)‍:每个元素前都有一个 type byte 标识其数据类型,随后是键名和对应的二进制值。常见类型包括:
    • double(64 位浮点)
    • string(UTF‑8)
    • document(嵌套文档)
    • array(数组)
    • binary(二进制数据)
    • objectId(MongoDB 专用唯一标识)
    • booleanint32int64decimal128datetimestamp 等

这种 type‑value‑key 的布局使得解析器能够在不完整读取整个文档的情况下,快速定位并跳过不感兴趣的字段,从而实现 高效遍历


2. 与 JSON 的区别

项目 JSON BSON
编码方式 纯文本(UTF‑8) 二进制
数据类型 字符串、数字、布尔、null、数组、对象 除 JSON 基本类型外,还支持 DateBinDataObjectIdDecimal128int32/64 等
存储空间 键名以字符形式出现,数字以字符串形式存储,可能更紧凑 键名以 C‑string 存储,数字使用固定字节长度,整体空间略大于最紧凑的 JSON
解析速度 需要逐字符解析,数值需转换 直接读取二进制类型,省去类型推断和字符串转数值的过程,解析更快
可遍历性 需要完整解析后才能定位字段 通过长度前缀和 type byte,可在不完整读取的情况下快速跳转

3. BSON 在 MongoDB 中的角色

  • 内部存储:MongoDB 将所有文档默认以 BSON 格式写入磁盘,并在磁盘上保持 16 MB 以下的单文档大小限制。
  • 网络传输:客户端与服务器之间的所有数据交互(查询、写入、更新等)均使用 BSON 编码,以降低网络带宽消耗并提升响应速度。
  • 驱动支持:几乎所有官方语言驱动(如 Node.js、Python、Java、C# 等)内部都集成了 BSON 编解码库,开发者通常不需要手动处理,只需使用语言原生对象即可。

4. BSON 的优势

  1. 高效的二进制序列化:固定长度的数值类型和类型前缀让读取/写入速度快。
  2. 丰富的数据类型:原生支持日期、二进制、ObjectId、Decimal128 等,满足业务需求。
  3. 可遍历性:通过长度信息可以直接跳过不需要的字段,适合大文档的局部查询。
  4. 跨语言生态:多语言官方库成熟,使用门槛低。

(来源:轻量级、可遍历性、高效性等特性在多篇技术说明中被统一提及)


5. BSON 的局限与注意事项

  • 空间开销:键名以 C‑string 存储且每个字段都携带类型字节,导致在字段很多、键名冗长的情况下文档体积会比最紧凑的 JSON 更大。
  • 文档大小限制:单个 BSON 文档最大为 16 MB,超过此上限需拆分或使用 GridFS 等方案。
  • 不适合极端压缩需求:如果对磁盘空间极度敏感,仍可能选择更紧凑的二进制协议(如 Protocol Buffers、CBOR)。

6. 常见使用场景

  • NoSQL 文档数据库:MongoDB 的核心存储格式。
  • 跨语言数据交换:在微服务之间传递结构化数据时,利用 BSON 的二进制特性降低网络开销。
  • 日志与审计:需要记录时间戳、二进制附件等多类型信息的场景。
  • 嵌入式系统:对解析速度有严格要求且数据结构相对固定的 IoT 设备。

7. 小结

BSON 通过 二进制化的 JSON 实现了 高效、灵活且跨语言 的文档存储与传输方案。它在 MongoDB 中扮演核心角色,提供了比纯文本 JSON 更快的解析速度和更丰富的数据类型,但也带来了略高的存储开销和文档大小限制。了解其结构与特性,有助于在设计数据库模型、网络协议或跨系统数据交互时作出更合适的技术选型。

来源:www.aiug.cn
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!