了解 BSON 中的二进制子类型:什么是 "function" (\x01) 以及有哪些可能的用户定义子类型?
Understanding binary subtypes in BSON: what is a "function" (\x01) and what possible user defined subtypes are there?
bsonspec.org列出了一组二进制子类型,包括通用二进制(\x00)、函数(\x01)、UUID(\x04)、MD5(\x05)、用户定义(\x80)。
问题是:
- 什么是 "function" 子类型,它的用途是什么?如果这是编译后的字节码,有什么限制吗?是否在MongoDB中使用?
- 有哪些用户定义的子类型?语法说它只是 \x80,但底部的注释补充说 \x80-\xFF 范围内的任何子类型都是用户定义的。我之前尝试过 reactivemongo,但它无法解析除 \x80 之外的任何用户定义类型。一些谷歌搜索表明,例如,perl mongodb 库也只知道 \x80 而不知道其他的。那么,这是一个错误吗,库不支持 \x81-\xFF?
1) IIRC,MongoDB 中未使用子类型 1。它也许应该被弃用。我不记得它的历史,如果有人记得请评论,否则我认为它很古老。
2) 规范文档可以更清楚,0x80 - 0xff 都是合法的,并且该范围是为用户定义的子类型保留的。或者更确切地说,小于 0x80 是为预定义类型保留的。
一般来说,目前,MongoDB 不对 BinData 子类型进行任何语义处理,它认为它们是用户数据。 (除了子类型不同之外,出于查询目的,服务器绝对不会认为两个 BinData 值相等。)shell 也有一些能力 pretty-print MD5 和 UUID 以及这些的帮助程序,我相信。
也就是说,将 BSON ex-Mongo 用于任何需要序列化某些数据的地方是非常有意义的,尤其是在某种程度上是动态类型的情况下,并且工具应该期望值是合理的,如果子类型是暗示(例如,UUID 子类型应该是 16 字节值,即使 MongoDB 服务器目前不会真正关心它)。
如果工具不允许 > 0x80,它可能需要调整。
仅供参考,本文档中提到了子类型 0x03
,作为遗留 UUID 类型:https://studio3t.com/knowledge-base/articles/mongodb-best-practices-uuid-data/
bsonspec.org列出了一组二进制子类型,包括通用二进制(\x00)、函数(\x01)、UUID(\x04)、MD5(\x05)、用户定义(\x80)。 问题是:
- 什么是 "function" 子类型,它的用途是什么?如果这是编译后的字节码,有什么限制吗?是否在MongoDB中使用?
- 有哪些用户定义的子类型?语法说它只是 \x80,但底部的注释补充说 \x80-\xFF 范围内的任何子类型都是用户定义的。我之前尝试过 reactivemongo,但它无法解析除 \x80 之外的任何用户定义类型。一些谷歌搜索表明,例如,perl mongodb 库也只知道 \x80 而不知道其他的。那么,这是一个错误吗,库不支持 \x81-\xFF?
1) IIRC,MongoDB 中未使用子类型 1。它也许应该被弃用。我不记得它的历史,如果有人记得请评论,否则我认为它很古老。
2) 规范文档可以更清楚,0x80 - 0xff 都是合法的,并且该范围是为用户定义的子类型保留的。或者更确切地说,小于 0x80 是为预定义类型保留的。
一般来说,目前,MongoDB 不对 BinData 子类型进行任何语义处理,它认为它们是用户数据。 (除了子类型不同之外,出于查询目的,服务器绝对不会认为两个 BinData 值相等。)shell 也有一些能力 pretty-print MD5 和 UUID 以及这些的帮助程序,我相信。
也就是说,将 BSON ex-Mongo 用于任何需要序列化某些数据的地方是非常有意义的,尤其是在某种程度上是动态类型的情况下,并且工具应该期望值是合理的,如果子类型是暗示(例如,UUID 子类型应该是 16 字节值,即使 MongoDB 服务器目前不会真正关心它)。
如果工具不允许 > 0x80,它可能需要调整。
仅供参考,本文档中提到了子类型 0x03
,作为遗留 UUID 类型:https://studio3t.com/knowledge-base/articles/mongodb-best-practices-uuid-data/