您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2025/7/19 22:08:45发布11次查看
按照惯例,我在这里先介绍一下什么是bson。 bson是binary json的简称,是一种类json的一种二进制形式的存储格式。目前bson主要被mongodb(目前一个较为流行的非关系数据模型的开源数据库)使用于存储数据和网络数据交换。 下面我们进入正题,介绍一下bson是
按照惯例,我在这里先介绍一下什么是bson。
bson是binary json的简称,是一种类json的一种二进制形式的存储格式。目前bson主要被mongodb(目前一个较为流行的非关系数据模型的开源数据库)使用于存储数据和网络数据交换。
下面我们进入正题,介绍一下bson是怎么把一个个mongodb的文档转换成二进制形式进行存储的,在此之前读者需要从bson官网上大致了解一下其解释的规则,链接会在下面的参考资料中给出。
至于介绍的形式,当然是给出例子,为大家讲解每个转换的步骤。
在介绍转换步骤之前,读者需要了解bson中有四种基本类型
 下面给出例子
例1:
1 {2 name: dataresearchlab,3 isgreat:true,}
先来说明一下这个例子,这个就是非关系型数据库中存放数据的形式,在bson上的解释就是相当于一个document。如果要用关系型数据库进行解释的话,这个就相当于一个记录,但是这个记录有自己的列名。继续解释上面的记录,最外面的{}相当于变成语言中{} 的作用,即表示一个范围,也就是说这里面的数据是作为一个整体需要进行存储的。里面的:左面可以理解为是键值,即一个数据库中只有唯一的一个键值。顺便提一下,在bson所有的键值都被视为cstring 类型(bsong存储的基本类型中的一种)。:的右面是左面键值对应的值,这个值可以有很多形式,如布尔型,字符串,32位整型,浮点型,甚至是数组,javascript的代码,正则表达式或是在嵌套一个document等等,香港服务器,具体有什么读者可以查看bson官网的介绍。
再返回来看这个例子,照之前的解释,相当于用户想要在数据库中存储一个数据,这个数据包括三个数据项。其中键值name对应存储的数据是字符串型的dataresearchlab ,键值isgreat对应存储的数据是布尔型数据true,香港虚拟主机,键值feilds对应存储的是一个数组型的数据[cloudcomputing,nosql,bigdata]。
接下来进入正题,看看运用bson是怎么把该数据转换成二进制形式在非关系数据库中存储的。数据被作为一个document跟据bson的规则(具体规则这里不给出,请查看bson官网的规则说明)需要进一步进行分解为三项int32,e_list, \x00。
先来介绍一下int32。int32需要占用四个字节,但是这个有两点需要特别注意。第一点就是,document解释成的int32是用来计算该document的长度的,但这个长度包含本身自己int32四个字节的长度。以本例来算,总共的document需要102个字节,这102个字节包括本身int32所占的四个字节和后面所解释出的所有的所需的字节长度,当然102个字节在一开始是没法算出来的,只有将该document都解释完才会算出这个数据。第二点要说明的是,存储长度本身占有四个字节,而这四个字节需要高位存储。至于什么是高位存储,这里只给一个简单的解释,就是四个字节中的最低位字节对应到存储器的最高位,最高为的字节对应到存储器的最低位。本例中需要102个字节,对应到十六进制是\x66\x00\x00\x00,而不是\x00\x00\x00\x66(这种存储形式是低位存储)。
接下来说一下\x00。这个对应过来的十六进制相当于是一个结束符,有点类似于程序设计语言中字符串类型最后的\0。表示该部分解释的结束。
下面介绍关键的部分e_list。e_list也只是bson规则中的一个中间形式,即e_list需要进行进一步的解释。e_list的进一步解释成两部分。第一部分是element,第二部分是e_list或是。先说一下第二部分,在此时第一步解释出的e_list需要将第二部分解释成e_list。为什么呢,因为例子中需要存储的并不只有name一项,在其后面还有isgreat和feilds需要解释,换句话说e_list这一步需要进行递归,继续循环解释。那么什么是后e_list解释成呢?当解释到最后一项fields时,后面没有需要存储的数据项时,需要将其第二部分解释成,这还需要注意一点的是并不占用存储空间,也就是说它是没有长度的,可以理解为在bson的解释最后的形式中并不存在。
回来说第一部分element。需要说明的是element也是作为一个中间形式需要继续往下解释,element也是bson中最丰富的解释,也就是说它可以被解释成很多的形式。而解释成哪种形式需要针对于存储数据的类型进行选择。注意这里存储数据的类型指的不是键值,因为前面已经说过bson把所有的键值只解释成为cstring一种类型,这里说的存储数据类型是指与键值一一对应的数据的类型。这里name所存储的类型是bson基本存储类型中的utf-8 string。后面isgreat和fields分别对应的是bson基本存储类型中的boolean true和array。
继续说name部分的解释。前面一段已经说过其对应的是基本存储类型中的utf-8 string。那么根据bson的规则element需要解释成\x02,e_name,string三部分。第一部分对应的是最后的存储形式,它代表了这种选择的类型,即\x02。第二部分e_name需要进一步唯一解释成cstring,即键值的类型。而cstring也需要进行唯一解释成(byte*)和\x00。(byte*)代表存储的是键值本身,即name(这里不包括双引号)。而\x00和之前的一样,代表这部分解释的结束。string跟上,需要唯一解释成int32,(byte*)和\x00三部分。下面来看这三部分。先来解释第二部分和第三部分,这两部分的含义和以前出现这两部分的含义是相似的,也就是说(byte*)代表存储了dataresearchlab(之前代表的是键值,这里代表的是数据值)。\x00代表了这部分的结束。第一部分这里也有一个int32的类型,但是绝对要注意的是这与document中解释出的int32是不一样的。在document中解释出来的int32用加粗字体说了两个注意事项,香港虚拟主机,这里要说明stirng解释的int32和document相同和不相同的地方。string解释出的int32同样是进行高位存储,但是不同点在于算出后面解释出二进制的长度不包括int32本身的四个字节。这个int32存储的是\x10\x00\x00\x00,这包括dataresearchlab15个字节和结束符号\x00一个字节。
其实,到这里,对于name键值这部分的存储已经介绍完毕,但是对于整个例子的存储还远没有结束。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product