什么是二进制 json (BSON) 中的二进制?

Posted

技术标签:

【中文标题】什么是二进制 json (BSON) 中的二进制?【英文标题】:what is binary in binary json (BSON)? 【发布时间】:2019-07-24 20:08:43 【问题描述】:

为什么二进制字被用于 BSON,当它以如下格式存储数据时

A document such as  "hello": "world"  will be stored as:

Bson:
  \x16\x00\x00\x00               // total document size
  \x02                           // 0x02 = type String
  hello\x00                      // field name
  \x06\x00\x00\x00world\x00      // field value (size of value, value, null terminator)
  \x00                           // 0x00 = type EOO ('end of object')

对于这种格式,我们还需要解释器来解析并将其转换为机器指令和

它以何种方式压缩实际的 JSON 数据并进行快速解释?

【问题讨论】:

"...我们需要解释器来解析并将其转换为机器指令.." - 不,那是完全不同的事情。这些不是“机器指令”,而只是用于存储数据的“字节格式”。类 JSON 并不意味着它在任何时候都是 JSON。实际上,它只是“只是另一个打包数据结构”的“营销名称”。 不要忘记 "hello": "world" javascript 中只是看起来像这样。对于 Java、C# 或 Go,它看起来像是完全不同的语言,并且是该语言的原生语言。 BSON 是任何这些形式的“通用翻译”。但是对于“类型”,像 JSON 这样的基于文本的东西没有。 我的意思是说二进制这个词对 BSON 有什么意义,以及 BSON 的什么属性使它变得更快。 【参考方案1】:

这是二进制数据类型的类比语义。 BSON 二进制文件有一个字节数组,表示从 0 到 127 的内部子类型。

例如:字节 0000 0000 1000 表示十六进制“\x08”,表示 BSON 规范中的布尔类型。

驱动程序将负责编码和解码 UTF-8 到 BSON 格式,存储引擎如 MongoDB 中的 WiredTiger 将负责对 BSON 格式的数据进行序列化和反序列化。

【讨论】:

但是是什么让这些数据的解析速度更快? 为 WiredTiger 访问 bson 更合适、更快速,因为它是设计使然,即使考虑到将 json 转换为 bson 也是一种折衷。我在内存中做了一些测试,wt 在我的环境中与时间非常相似。

以上是关于什么是二进制 json (BSON) 中的二进制?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb-bson

bson

MongoDB面试题

MongoDB面试题

BSON数据格式

20个MongoDB经典面试题