BSON格式解释

原创 2011年10月23日 02:48:33

http://bsonspec.org/

BSON这种格式是专门为MongoDB而开发的,类似json的一种二进制格式。

这种格式不一定比json存储的文件小,其优点是解释快。


官方说明文档:

http://bsonspec.org/#/specification


下面简单列举下:

基本类型都是小端存储。

基本类型:

byte         1字节(8位)

int32        4字节 (32位的有符号整数)

int64        8字节 (64柆的有符号整数)

double     8字节 (64柆的浮点数)

高级类型:

document

::=

int32 e_list "\x00"

BSON Document

文档=文档的长度+元素列表+"\x00"

e_list

::=

element e_list

Sequence of elements

元素列表=一个元素 元素列表

 

|

""

或者是 ""

元素可以是不同类型,注意元素包含元素名,如"key":"value"的类型是"\x02",元素名是"key"

element

::=

"\x01" e_name double

Floating point

"\x01"+元素名+double

 

|

"\x02" e_name string

UTF-8 string

\x02"+元素名+string

 

|

"\x03" e_name document

Embedded document

嵌入文档(子文档)

 

|

"\x04" e_name document

Array

数组,一种特殊的子文档

  

|

"\x05" e_name binary

Binary data

二进制数据

 

|

"\x06" e_name

Undefined — Deprecated

未使用的

 

|

"\x07" e_name (byte*12)

ObjectId

对象ID,即MongoDB中默认的"_id"的类型。12字节。

 

|

"\x08" e_name "\x00"

Boolean "false"

 

|

"\x08" e_name "\x01"

Boolean "true"

 

|

"\x09" e_name int64

UTC datetime

 

|

"\x0A" e_name

Null value

 

|

"\x0B" e_name cstring cstring

Regular expression

 

|

"\x0C" e_name string (byte*12)

DBPointer — Deprecated

 

|

"\x0D" e_name string

JavaScript code

 

|

"\x0E" e_name string

Symbol

 

|

"\x0F" e_name code_w_s

JavaScript code w/ scope

 

|

"\x10" e_name int32

32-bit Integer

 

|

"\x11" e_name int64

Timestamp

 

|

"\x12" e_name int64

64-bit integer

 

|

"\xFF" e_name

Min key

 

|

"\x7F" e_name

Max key

e_name

::=

cstring

Key name

string

::=

int32 (byte*) "\x00"

String

长度 + 内容 + '\0'

cstring

::=

(byte*) "\x00"

CString

内容 + "\0'

binary

::=

int32 subtype (byte*)

Binary

长度+二进制子类型的数据

subtype

::=

"\x00"

Binary / Generic

二进制数据的子类型的数据类型

 

|

"\x01"

Function

 

|

"\x02"

Binary (Old)

 

|

"\x03"

UUID

 

|

"\x05"

MD5

 

|

"\x80"

User defined

code_w_s

::=

int32 string document

Code w/ scope


要注意数组实际上也是一个子文档。如["apple", "banana"],实际上是{ "0" : "apple", "1" : "banana"}。

数组之所以用"0","1","2"...来表示第几号元素,这样存储是可以节省空间。因为如果使用int,则会用到4个字节,考虑到数组的元素个数一般比较少。用"0"来表示第0个元素,只使用2个字节的空间。


官方例子详解:

官方网站上虽然有动态演示,不过还是可以详细解释下。

{"hello""world"}   "\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00"


前面"\x16\x00\x00\x00" : 文档的长度,这里是小端表示,即文档的长度是22个字节

第5个字节:\x02        : 元素的类型,即"world"的类型是string,string类型 = 长度 + 内容 + '\0',注意,这里指的是"world"的类型。

hello\x00              :  元素的名字,以"\0"结尾,在这里,元素的名字是hello。注意元素的名字是CString类型,不是String类型。即元素的名字是没有长度信息的。

x06\x00\x00\x00        : string类型的长度

world\x00              : string的内容和结尾的'\0'

最后一个"\x00"         : 文档的结尾


{"BSON"["awesome"5.051986]} "1\x00\x00\x00\x04BSON\x00&\x00 
 \x00\x00
\x020\x00\x08\x00\x00 
 \x00awesome\x00
\x011\x00333333 
 \x14@
\x102\x00\xc2\x07\x00\x00 
 \x00\x00"
1\x00\x00\x00          : 文档的长度

第5个字节\x04          : 元素的类型,\x04,即数组类型

BSON\x00               :  元素的名字,以"\0"结尾,在这里,元素的名字是BSON

&\x00\x00\x00          : 数组即一个子文档,子文档的长度,这里子文档实际上是{"0":"awesome","1":5.05,"2":1986}

\x02                   : 元素的类型,即"awesome"的类型是string

0\x00                  :  即"0"'\0',即元素的名字是"0",字符串以'\0'结尾

\x08\x00\x00\x00awesome\x00      : 长度 + "awesome" + '\0'

\x01                   :   元素的类型,即5.05的类型是Floating point

1\x00                  : 即"1"'\0',即元素的名字是"1"

333333\x14@            : 即5.05

\x10                   : 元素的类型,即1986的类型是32-bit Integer

2\x00                  : 即"2"'\0',即元素的名字是"2"

\xc2\x07\x00\x00       : 即1986

\x00                   : 子文档,即数组的结尾

\x00                   : 文档的结尾


总结:

我们可以看到BSON格式中,对子文档,数组都记录了其长度,所以可以快速地定位并解释数据。

同时,可以发现数组实际上就是特殊的子文档。

另外,我们在为元素起名时,应该尽量短,这样可以提高解释的效率。

比如 {“key" : "value"}  改为 { "k" : "value"} 。

BSON对UTF-8字符串友好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

BSON与JSON的区别

BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schem...
  • z69183787
  • z69183787
  • 2014年05月23日 15:19
  • 39897

BSON结构

BSON结构 flyfish 2015-7-24 主要解释bsonspec.org网站上的两个例子 {"hello": "world"}  hello为key,wo...
  • flyfish1986
  • flyfish1986
  • 2015年07月24日 01:25
  • 1842

mongodb导入bson数据

本地数据库导入bson格式的数据: $ mongorestore.exe --host 127.0.0.1 --port 27017 -d dbname bsonFile host:127...
  • hfhwfw161226
  • hfhwfw161226
  • 2017年06月20日 14:44
  • 2320

运用BSon将数据记录转换成二进制

按照惯例,我在这里先介绍一下什么是BSon。 BSon是Binary JSON的简称,是一种类Json的一种二进制形式的存储格式。目前Bson主要被MongoDB(目前一个较为流行的非关系数据模...
  • Adrastos
  • Adrastos
  • 2013年06月14日 12:43
  • 1300

BSON格式解释

http://bsonspec.org/ BSON这种格式是专门为MongoDB而开发的,类似json的一种二进制格式。 这种格式不一定比json存储的文件小,其优点是解释快。 官方...
  • lyq240919525
  • lyq240919525
  • 2014年10月25日 01:08
  • 2532

json与bson的区别

bson是由10gen开发的一个数据格式,目前主要用于mongoDB中,是mongoDB的数据存储格式。bson基于json格式,选择json进行改造的原因主要是json的通用性及json的schem...
  • xiaojin21cen
  • xiaojin21cen
  • 2017年03月09日 09:08
  • 2708

BSON及mongoDB数据类型

JSON是一种被广泛使用的轻量级的数据交换格式,支持现今绝大多数主流的开发语言。而近几年崛起的mongDB则采用了类JSON的数据格式,在JSON之上进行了丰富和增强,使得mongoDB可以处理及报错...
  • robinson_0612
  • robinson_0612
  • 2016年09月26日 11:48
  • 4384

BSON是什么

BSON简称二进制的JSON,是JSON的二进制序列化编码格式,像JSON一样,BSON支持文档数组,BSON支持二进制压缩格式,像Proto­col Buf­fers,但是BSON比Protocol...
  • lxzo123
  • lxzo123
  • 2011年09月08日 23:04
  • 3385

bson的操作

bson的操作flyfish 2015-8-27使用的是bson-cppbson的创建//{ name : 'joe', age : 33.7 } //方式1 bson::bo a =...
  • flyfish1986
  • flyfish1986
  • 2015年08月17日 15:17
  • 1999

BSON能走多远

代码: http://download.csdn.net/source/2139850   BSON是在json基础上一哥们提出的新的数据形式,它就是直接把一个对象转化为二进制数字来表示。。目前百度上...
  • dujingjing1230
  • dujingjing1230
  • 2010年03月18日 13:50
  • 22274
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BSON格式解释
举报原因:
原因补充:

(最多只允许输入30个字)