了解BSON中的二进制子类型:什么是“函数”(\ x01)以及可能的用户定义的子类型是什么?

时间:2016-01-04 07:25:41

标签: mongodb bson

bsonspec.org列出了一组二进制子类型,包括通用二进制(\ x00),函数(\ x01),UUID(\ x04),MD5(\ x05),用户定义(\ x80)。 问题是:

  1. 什么是“功能”子类型及其用途是什么?如果这是一个编译的字节码,它有什么限制吗?它是否在MongoDB中使用?
  2. 有哪些用户定义的子类型?语法说它只是\ x80,但是底部的注释补充说,\ x80- \ xFF范围内的任何子类型都是用户定义的。我以前尝试过reactivemongo,它无法解析除\ x80之外的任何用户定义类型。一些谷歌搜索表明,例如,perl mongodb库也只知道\ x80而不是其他人。那么,这是一个错误吗,库不支持\ x81- \ xFF?

2 个答案:

答案 0 :(得分:1)

1)IIRC,子类型1未在MongoDB中使用。它可能应该被弃用。我不记得它的历史,如果有人请评论,否则我认为它是古老的。

2)规范文档可能更清楚,0x80 - 0xff都是合法的,并且该范围是为用户定义的子类型保留的。或者为预定义类型保留小于0x80。

一般来说,目前,MongoDB不会在BinData子类型的语义上做任何事情,它会将它们视为用户数据。 (除非子类型有所不同,否则服务器绝对不会认为两个BinData值是相同的。出于查询目的。)此外,shell还有一些能够为那些人打印MD5和UUID以及帮助器的能力。我相信。

也就是说,将BSON ex-Mongo用于需要序列化某些数据的任何事情都是完全合理的,特别是如果有些动态类型,并且工具应该期望值是合理的,如果是一个暗示的子类型(例如UUID子类型应该是16字节值,即使MongoDB服务器当前并不真正关心它。

如果工具不允许> 0x80它可能需要调整。

答案 1 :(得分:0)

仅供参考,我们在本文档中提到了0x03子类型,作为传统的UUID类型:https://studio3t.com/knowledge-base/articles/mongodb-best-practices-uuid-data/