Mongodb b二进制协议如何工作';?如何读取(伪)巴科斯诺尔表?

Mongodb b二进制协议如何工作';?如何读取(伪)巴科斯诺尔表?,mongodb,bson,Mongodb,Bson,我正在阅读MongoDB规范,它使用数据格式 查看文档,我想了解页面底部的示例BSON是如何编码的 {"hello": "world"} → "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00" {"BSON": ["awesome", 5.05, 1986]} → "\x31\x00\x00\x00\x04BSON\x00\x26\x00 \x00\x00\x020\x00\x08\x00\x00 \x

我正在阅读MongoDB规范,它使用数据格式

查看文档,我想了解页面底部的示例BSON是如何编码的

{"hello": "world"}  →   "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"

{"BSON": ["awesome", 5.05, 1986]}   →   "\x31\x00\x00\x00\x04BSON\x00\x26\x00 
 \x00\x00\x020\x00\x08\x00\x00 
 \x00awesome\x00\x011\x00\x33\x33\x33\x33\x33\x33
 \x14\x40\x102\x00\xc2\x07\x00\x00 
 \x00\x00"

我认为问题本质上是‘二进制协议如何工作’?或者“我如何阅读(伪)巴克斯·诺尔表格?”

您可以这样想:您的协议由用于构造数据的格式信息和数据本身组成。例如,您在JSON中看到的开头括号
{
,意思类似于“开始一个新的(子)文档”

根据定义,此“命令”是隐式的,只包含要跟随的所有内容的长度,然后是内容(一个
e_列表
),然后是一个
\x00
终止符字节,该“命令”是
\x16\x00\x00\x00
。为什么三个
\x00
?因为我们需要一个int32,即一个32位整数,所以必须将其填充到完整的四个字节。为什么
\x16\x00\x00\x00\x00
而不是
\x00\x00\x00\x16
?这称为endianess,BSON使用小endian

然后是内容的定义,
e_列表
。一个
e_列表
被定义为一个
元素
,后面是另一个e_列表,可以是空的,然后终止。
元素
首先被定义为值的类型,然后是
e_名称
,然后是实际数据。因此ode>“hello”是
“world”
,它是一个字符串,字符串由
\x02
标识。根据规范,接下来是
\x02
,后面是
e_name
“hello”和空终止符(
hello\x00


现在是字符串的实际值,它被定义为
int32(byte*)“\x00”
,即字符串的长度、实际数据和空终止符(长度包括空终止符),因此长度变为
\x06\x00\x00\x00\x00
,然后是顶级BSON文档的实际数据
world\x00
\x00
终止符。

什么意思,“它是如何工作的?”?这是一个二进制协议。我的意思是每个字节意味着什么?使用MongoDB不需要了解BSON数据格式。所有驱动程序都会对你隐藏这些细节。你永远不必自己编写这些字节。你为什么还要知道这一点?另外,规范就在你自己发布的链接上。我知道我不必理解然后使用MongoDB。我只是好奇。谢谢,这是一个非常清楚的答案。也找到了