什么是;0“;MongoDB中的平均值';s BinData(0,“E8MENZOFYMMD7WSHDNRFJYEK8M=”)?

什么是;0“;MongoDB中的平均值';s BinData(0,“E8MENZOFYMMD7WSHDNRFJYEK8M=”)?,mongodb,base64,bson,Mongodb,Base64,Bson,MongoDB shell以Base64编码字符串的形式打印二进制数据,该字符串封装在函数调用中: "_id" : BinData(0,"e8MEnzZoFyMmD7WSHdNrFJyEk8M=") “0”是什么意思?我相信它们对应于: 子类型::=“\x00”二进制/通用 |“\x01”函数 |“\x02”二进制文件(旧) |“\x03”UUID |“\x05”MD5 |“\x80”用户定义 综上所述,似乎0几乎总是一个有效的选择。 BSON BinData数据类型通过shell中的类Bin

MongoDB shell以Base64编码字符串的形式打印二进制数据,该字符串封装在函数调用中:

"_id" : BinData(0,"e8MEnzZoFyMmD7WSHdNrFJyEk8M=")
“0”是什么意思?

我相信它们对应于:

子类型::=“\x00”二进制/通用 |“\x01”函数 |“\x02”二进制文件(旧) |“\x03”UUID |“\x05”MD5 |“\x80”用户定义

综上所述,似乎
0
几乎总是一个有效的选择。

BSON BinData数据类型通过shell中的类BinData表示。有关详细信息,请运行帮助杂项

> new BinData(2, "1234")
BinData(2,"1234")
脱壳

help misc
b = new BinData(subtype,base64str)  create a BSON BinData value
您案例中的
0
是BSON子类型

关于这个问题的类似问题


Macrolinux是正确的,但您必须小心使用他的示例,因为它会起作用,但这是偶然的

BinData()的第一个参数是BSON二进制子类型,如前所述,它是以下类型之一:

generic:  \x00 (0)
function: \x01 (1)
old:      \x02 (2)
uuid_old: \x03 (3)
uuid:     \x04 (4)
md5:      \x05 (5)
user:     \x80 (128)
这些只是帮助工具,因此反序列化器可以根据这些字节表示的内容对二进制数据进行不同的解释,子类型2除外,该子类型2类似于通用子类型,但将表示字节数组长度的int32存储为数据的前4个字节

现在要了解示例的错误原因,您将注意到调用BinData(2,“1234”)不会存储表示字符串“1234”的二进制文件,原因有两个:

  • BinData函数将该字符串解释为base64编码字符串
  • 类型2要求前4个字节是包含字节数组长度的int32

有关更多信息,请参见bsonspec.org。

有趣。这些子类型用于任何用途吗?我想是的:-)。ask的最佳场所是BSON小组。确切地说,新的
\x00
和历史的
\x02
()之间存在差异是有原因的。对于UUID和MD5(我的意见)是优化。两者都是固定长度的十六进制(16字节/128位/32位十六进制数字,布局位不同UUID有
-
)并且广泛使用,驱动程序实现者可以优化读/写。我不知道驱动程序可以在这里优化什么。所有二进制类型都存储为
length(int32)子类型字节*
。无论是否为固定长度,都会存储长度。数据存储为原始字节(不是十六进制)。可能是数据验证的一个选项?或者出于显示目的:UUID的显示可能比BinData(3,……)更好。?此处的初始链接不再讨论BinData。即使这个链接也没有定义这些值的含义,但它确实记录了Mongo与BSON规范的协议:
> new BinData(2, "1234")
BinData(2,"1234")