BSON 语法规范v1.0(BSON Specification
2016-11-08 本文已影响175人
非典型程序员
BSON 是一种类似 JSON 的二进制编码存储格式,它将0或多个键值(zero or more key/value pairs)对当做单独的实体(a single entity)进行二进制格式存储,我们把这个实体称作了文档(document)。BSON 的语法规范是采用伪 BNF 编写的,有效的 BSON 数据使用无终端符的文档编写的(We've written the grammar using a pseudo-BNF syntax. Valid BSON data is represented by the document non-terminal.)。
基本类型(用作终端符)
以下的基本类型,在语法中用于作为终端符号使用,而却每一种类型都只是使用小端序格式(Little-endian format:一种数据编码的方式,与之的对应的是Big-endian format)
类型 | 描述 |
---|---|
byte | 1个字节(8位) |
int32 | 4个字节(32位有符号整数,补码表示;32-bit signed integer, two's complement) |
int64 | 8个字节(64位有符号整数,补码表示;64-bit signed integer, two's complement) |
double | 8个字节 (64位 IEEE 754-2008 二进制浮点数) |
decimal128 | 16 bytes (128位 IEEE 754-2008 十进制浮点数) |
非终端符
以下指定BSON中的非终端字符语法。值得注意的是,使用引号扩起来的字符串使用的上述“终端符”描写的,而且应该遵循 C 语言规范理解(比如说: “\x01” 表示二进制字节 0000 0001)。此外同时也请注意我们使用操作符作为重复的速记法(如,("\x01"2)代表"\x01\x01"),当*作为一元操作符,意味着可以重复出现0次以上。
document::=int32 e_list "\x00" BSON 文档。 int32是文档的字节总数。
e_list::=element e_list 文档的顶级元素列表
| ""
element::= "\x01" e_name double (表示该元素是64位的二进制浮点数)
| "\x02" e_name string (表示该元素是UTF-8的字符串)
| "\x03" e_name document (表示该元素是内嵌的Document)
| "\x04" e_name document (表示该元素是内嵌的 Array Document)
| "\x05" e_name binary (表示该元素是二进制数据)
| "\x06" e_name (Undefined (value) 已废弃)
| "\x07" e_name (byte*12) (ObjectId 12个字节的ObjectID)
| "\x08" e_name "\x00" (Boolean 表示Boolean变量 false)
| "\x08" e_name "\x01" (Boolean 表示Boolean变量 true)
| "\x09" e_name int64 (UTC datetime)
| "\x0A" e_name (空值:Null value)
| "\x0B" e_name cstring cstring (正则表达式)
| "\x0C" e_name string (byte*12) (DBPointer —*Deprecated*)
| "\x0D" e_name string (JavaScript 代码)
| "\x0E" e_name string (符号:Symbol.*已废弃)*
| "\x0F" e_name code_w_s (JavaScript code w/ scope)
| "\x10" e_name int32 (32位有符号整型)
| "\x11" e_name int64 (时间戳)
| "\x12" e_name int64 (64位有符号整型)
| "\x13" e_name decimal128 (十进制浮点数)
| "\xFF" e_name (Min key)
| "\x7F" e_name (Max key)
e_name::=cstring (建值名称)
string::=int32 (byte*) "\x00" (字符串,Int32是 总字节数 (byte*) + 1(结尾\x00))
cstring::=(byte*) "\x00" (C格式的字符串,UTF-8 encoded characters)
binary::=int32 subtype (byte*) (二进制, Int32是总字节数 (byte*))
subtype::= "\x00" (Generic binary subtype)
| "\x01" (Function)
| "\x02" (Binary (Old))
| "\x03" (UUID (Old))
| "\x04" (UUID )
| "\x05" (MD5)
| "\x80" (User defined)
code_w_s::=int32 string document (Code w/ scope)
注意
- Array - 数组文档是一个正常的BSON文档。keys是从0开始顺序编号的整数.例如,一个数组['red', 'blue']编码为document表示{'0': 'red', '1': 'blue'}。keys必须是升序的。
-
UTC datetime - int64是以毫秒为单位的Unix时间.
Timestamp - 使用 MongoDB 复制和分片的特别内部类型。前4字节是增量,后4字节时间戳. - Min key - 与其他可能的 BSON 元素值进行小于比较的特殊类型。
- Max key - 与其他可能的 BSON 元素值进行大于比较的特殊类型。
- Generic binary subtype - 这是最常用的二进制子类型,应该是驱动程序和工具默认类型。
-
BSON "binary"或"BinData"的数据类型用来表示的字节数组。 它是有些类似于Java的ByteArray的概念。BSON 二进制值有一种亚型。这用于指示在字节数组中存储的是什么样的数据。从0到127的子类型是预定义或保留的,从128-255 的子类型是用户定义的。
- \x02 Binary(旧版本)- 这曾经是默认的子类型,已经被废弃,现在通常使用 \x00 。驱动程序和工具应务必妥善处理 \x02。二进制数据 (byte* 中的数组的二进制非终端符) 的结构必须是int32后紧接着(byte)。Int32是(byte)的重复的次数。
- \x03 UUID(旧版本)** - 这曾经是 UUID 亚型,已经被废弃,现在通常使用 \x04 。驱动程序和工具的语言与本机的 UUID 类型应适当地处理 \x03。
- \x80-\xFF是用户定义的子类型。二进制数据可以是任何数据。code_w_s带一个int32范围,表示代码以字节为单位的长度。该字符串是 JavaScript 代码。该文件是从标识符映射到值,表示应在其中计算字符串的范围。
- **Code w/ scope ** - The int32 is the length in bytes of the entire code_w_s value. The string is JavaScript code. The document is a mapping from identifiers to values, representing the scope in which the string should be evaluated.
样例一
![](https://img.haomeiwen.com/i2677594/892e9252771f908e.png)
样例二
![](https://img.haomeiwen.com/i2677594/bc8ce89f854dfe22.png)
样例三
![](https://img.haomeiwen.com/i2677594/bdf3bf221492df85.png)