【问题标题】:What does the "0" mean in MongoDB's BinData(0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M=")?MongoDB 的 BinData(0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M=") 中的“0”是什么意思?
【发布时间】:2012-03-09 11:40:52
【问题描述】:

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

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

“0”是什么意思?

【问题讨论】:

    标签: mongodb base64 bson


    【解决方案1】:

    相信他们对应BSON subtypes

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

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

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • 有趣。这些子类型有什么用途吗?
      • 我猜是这样:-)。询问的最佳地点是 BSON 组。显然,新的\x00 和历史的\x02 (groups.google.com/group/bson/browse_thread/thread/…) 之间的差异是有原因的。对于 UUID 和 MD5(我的意见)是为了优化。两者都是固定长度的十六进制(16字节/128位/32位十六进制数字,布局位不同的UUID有-)并且被广泛使用,驱动实现者可以优化读/写。
      • 我不知道驱动程序可以在这里优化什么。所有二进制类型都存储为length(int32) subtype-byte bytes*。固定长度与否,存储长度。数据存储为原始字节(不是十六进制)。也许是数据验证的一个选项?或者出于显示目的:UUID 可以比BinData(3,........) 显示得更好?
      • 这里的初始链接根本不再讨论 BinData。即使这个链接也没有定义值的含义,但它确实记录了 Mongo 与 BSON 规范的协议:docs.mongodb.org/manual/reference/mongodb-extended-json
      【解决方案3】:

      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。

      【讨论】:

        猜你喜欢
        • 2015-03-20
        • 2018-09-10
        • 2020-01-07
        • 2016-06-03
        • 2020-04-02
        • 2014-11-06
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多