17

MongoDB shell 将二进制数据打印为一个 Base64 编码的字符串,包装在一个函数调用中:

"_id" : BinData(0,"e8MEnzZoFyMmD7WSHdNrFJyEk8M=")

“0”是什么意思?

4

3 回答 3

19

http://docs.mongodb.org/manual/reference/mongodb-extended-json/#binary

BSON BinData 数据类型通过 shell 中的 BinData 类表示。运行help misc以获取更多信息。

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

从壳

help misc
b = new BinData(subtype,base64str)  create a BSON BinData value

0您的情况下是 BSON 子类型

http://bsonspec.org/#/specification

binary  ::=   int32 subtype (byte*)   Binary - The int32 is the number of bytes in the (byte*).
subtype ::=   "\x00"  Generic binary subtype
  |   "\x01"  Function
  |   "\x02"  Binary (Old)
  |   "\x03"  UUID (Old)
  |   "\x04"  UUID
  |   "\x05"  MD5
  |   "\x80"  User defined

此线程上的类似问题

http://groups.google.com/group/mongodb-dev/browse_thread/thread/1965aa234aa3ef1e

于 2012-02-18T06:09:14.733 回答
8

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,它类似于通用子类型,但将表示字节数组长度的 int32 存储为数据的前 4 个字节。

现在看看为什么这个例子是错误的,你会注意到调用 BinData(2, "1234") 不会存储表示字符串 "1234" 的二进制文件,原因有两个:

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

有关详细信息,请参阅 bsonspec.org。

于 2013-04-03T17:33:00.410 回答
1

相信它们对应于BSON 子类型

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

看起来,这似乎0总是一个有效的选择。

于 2012-02-18T06:09:12.643 回答