一、Bson介绍
BSON是Binary JSON的缩写,是一种类json的一种二进制形式的存储格式。
它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON在JSON基础上进行了一些数据类型的扩展,如Date和BinData类型。
BSON是二进制形式的存储格式,类似于Google的Protocol Buffer。
但是BSON是“schema-less”的存储形式,这使得它在灵活性方面具有优势,但在空间效率方面也有一点劣势(对于序列化数据中包含的字段名,BSON有开销)。
二、特点:
BSON有三个特点:轻量级、可遍历性、高效性。
轻量级
对于任何一种数据表示格式(尤其是在网络上使用时)来说,将存储空间保持在最小值是非常重要的。
可遍历性
BSON被设计成易于操作。这是作为MongoDB的主要数据代表的重要支持。
高效性
由于使用了C数据类型,在大多数语言中,对BSON进行编码和对BSON进行解码都可以非常快速地完成。
三、Bson的数据类型
BSON支持的类型:
有一个枚举BsonType
(Bson 3.0新增的枚举),里面就是Bson的所支持的数据类型。
还有一个类BSON
,也包含了各种类型。
类型 | 序号 | 别名 | 备注 |
---|---|---|---|
Double | 1 | "double" | |
String | 2 | "string" | |
Object | 3 | "object" | Document类型 |
Array | 4 | "array" | |
Binary data | 5 | "binData" | |
Undefined | 6 | "undefined" | Deprecated |
ObjectId | 7 | "objectId" | |
Boolean | 8 | "bool" | |
Date | 9 | "date" | DATE_TIME类型 |
Null | 10 | "null" | |
Regular Expression | 11 | "regex" | |
DBPoint | 12 | "dbPointer" | Deprecated |
JavaScript | 13 | "javaScript" | |
Symbol | 14 | "symbol" | Deprecated |
JavaScript(with scope) | 15 | "javaScriptWithScope" | |
32-bit integer | 16 | "int" | |
Timestamp | 17 | "timestamp" | |
64-bit integer | 18 | "long" | |
Decimal128 | 19 | "decimal" | New version in 3.4. |
Min Key | -1 | "minKey" | |
Max Key | 127 | "maxKey" |
四、Bson的格式
主要解释bsonspec.org网站上的两个例子
一、对象
{"hello": "world"}
hello为key,world为value 对应的是
\x16\x00\x00\x00
\x02
hello\x00
\x06\x00\x00\x00world\x00
\x00
解释每一行的意思:
\x16\x00\x00\x00
:\x表示16进制的方式。4个字节表示文档的大小,包括文档末尾的'\0','\0'是\x00 0x16十进制是22,这个文档的大小是22个字节
采用小端(Little Endian) 原文:Each type must be serialized in little-endian format.
每一种类型必须按照little-endian格式序列化。
\x02
一个字节表示value的类型是string,字符串编码使用的是UTF-8
hello\x00
表示以'\0'结尾的字符串
\x06\x00\x00\x00world\x00
:\\x06\x00\x00\x00
前4个字节表示以'\0'结尾的字符串world的长度
\x00
结束符
二、数组
{"BSON": ["awesome", 5.05, 1986]}
数组['red', 'blue']将要编码为{'0': 'red', '1': 'blue'},key必须按照数值大小递增排序(升序)。
也就是["awesome", 5.05, 1986]将被编码为{ "0":"awesome", "1":5.05,"2":1986}
{"BSON": [ "0":"awesome", "1":5.05,"2":1986]}
对应是
\x31\x00\x00\x00
\x04BSON\x00
\x26\x00\x00\x00
\x02\x30\x00\x08\x00\x00\x00awesome\x00
\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
\x10\x32\x00\xc2\x07\x00\x00
\x00
\x00
解释每一行的意思
\x31\x00\x00\x00
:
4个字节表示文档的大小,x31的10进制是49,这个文档的大小是49个字节
\x04BSON\x00
:
\x04表示value的类型是数组表示的document
BSON\x00 表示以'\0'结尾的字符串
\x26\x00\x00\x00
:
4个字节表示数组的大小即中括号的内容,x26的10进制是38
\x02\x30\x00\x08\x00\x00\x00awesome\x00
:
\x02 表示value的类型是string
x30表示key,字符0的ASCII码是48,16进制是x30
纵向看正好是x30,x31,x32
\x08\x00\x00\x00 4个字节表示awesome\x00 长度
\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
:
\x01
表示64位的二进制浮点数
x31\x00表示以'\0'结尾的字符串1,字符1的ASCII码是x31
x33\x33\x33\x33\x33\x33\x14\x40
double的5.5转换成16进制为40 14 33 33 33 33 33 33
\x10\x32\x00\xc2\x07\x00\x00
:\x10表示32位的整数。\x32\x00表示以'\0'结尾的字符串2,字符2的ASCII码是x32
\xc2\x07\x00\x00也就是16进制的7c2转换成10进制是1986
最后两行的\x00 \x00
:结束符。
总结:看完了这个介绍,你有什么感觉?真香。写起来太麻烦了,看到这个有点像莫斯密码了,头大了,还是Json写起来简单。
但是Bson在存储上来说比json更轻量级。
五、Bson的一些API介绍
我这里只做了两张图,如下所示: