MongoDB中的bson介绍和使用实例

一、什么是bson

BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。

BSON可以做为网络数据交换的一种存储形式,这个有点类似于Google的Protocol Buffer,但是BSON是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想,BSON有三个特点:轻量性、可遍历性、高效性,
{“hello":"world"} 这是一个BSON的例子,其中"hello"是key name,它一般是cstring类型,字节表示是cstring::= (byte*) "/x00" ,其中*表示零个或多个byte字节,/x00表示结束符;后面的"world"是value值,它的类型一般是string,double,array,binarydata等类型。
 
二、bson在MongoDB中的使用

MongoDB使用了BSON这种结构来存储数据和网络数据交换。把这种格式转化成一文档这个概念(Document),因为BSON是schema-free的,所以在MongoDB中所对应的文档也有这个特征,这里的一个Document也可以理解成关系数据库中的一条记录(Record),只是这里的Document的变化更丰富一些,如Document可以嵌套。
MongoDB以BSON做为其存储结构的一种重要原因是其可遍历性。
 
三、几个BSON的例子

3.1 一个Document的BSON表示:


代码如下:


title:"MongoDB", 
last_editor:"192.168.1.122", 
last_modified:new Data("27/06/2011"), 
body:"MongoDB introduction", 
categories:["Database","NoSQL","BSON"], 
revieved:false 
}

这是一个简单的BSON结构体,其中每一个element都是由key/value对组成的

3.2 一个嵌套的例子

代码如下:


name:"lemo", 
age:"12", 
address:{ 
city:"suzhou", 
country:"china", 
code:215000 

scores:[ 
{"name":"english","grade:3.0}, 
{"name":"chinese","grade:2.0} 

}

这是一种相对复杂点的例子,其中包括了地址对象和分数对象数组,这里使用了嵌套文档对象与文档对象数据来表示单个学生的信息,这种嵌套的文档结构要使用关系数据库来做是比较复杂的。
 
4. BSON c++ 代码分析

MongoDB源代码树中包括了BSON的代码库,你只要包含bson.h这个头文件就行了,其中有四个类是比较重要的:

代码如下:

* mongo::BSONObj,这个是BSON对象的表示 
* mongo::BSONElement,这个是BSON对象中元素的表示方法  
* mongo::BSONObjBuilder,这是构建BSON对象的类 
* mongo::BSONObjIterator,这是用来遍历BSON对象中每一个元素的一个迭代器

下面是创建一个BSON对象

代码如下:

BSONObjBuilder b; 
b.append("name","lemo"), 
b.append("age",23); 
BSONObj p = b.obj();

或者

代码如下:

BSONObj p = BSONObjBuilder().append("name","lemo").append("age",23).obj();

或者用流的方法来

代码如下:

BSONObjBuilder b; 
b << "name" << "lemo" << "age" << 23; 
BSONObj p = b.obj();

或者用宏来创建一个对象

代码如下:

BSONObj p = BSON( "name" << "Joe" << "age" << 33 );

这里分析一下这四个类的一些代码:
mongo::BSONObj主要是用于存储BSON对象的,具体的存储格式如下

代码如下:

<unsigned totalSize> {<byte BSONType><cstring FieldName><Data>}* EOO 
        --------------------              -------------                -----------------               ----           --- 
totalSize: 一个总的字节长度,包含自身 
BSONType: 对象类型,这里有Boolean,String,Date等类型,具体可以参考bsontypes.h这个文件 
FieldName: 这里表示字段名 
Data: 这里是放具体的数据,数据的存储方式根据不同的BSONType来 
* : 表示可以有多个元素组成 
EOO: 这是一个结束符,一般是/x00来表示

一般来说,BSONObj的创建都是通过BSONObjBuilder来做的,除非你已经得到了其字节流,那可以直接生成BSONObj
 
mongo::BSONElement 它主要是用于存储对象中的单个元素,存储格式如下

代码如下:

<type><fieldName><value>

这个对象主要是指向BSONObj对象中具体元素的地址,它不实际存储元素的值。
mongo::BSONObjBuilder 它主要是用于生成BSONObj,这个对象集成了StringBuilder,它主要用于存储实际的字节点,用于替换std::stringstream,而这个StringBuilder集成了BufBuilder,这是一个可以动态增长内存缓冲区,但最大容量不能超过64MB的大小,也就是说一个BSONObj最大不能超过64MB。
 
mongo::BSONOBjIterator 它主要是用来遍历BSONObj对象中的每一个元素,提供了类似于stl iterator的一些接口,它还提供了一个ForEach宏来提供更方便的操作,如

代码如下:

if (foo) { 
           BSONForEach(e, obj) 
               doSomething(e); 
       }

(0)

相关推荐

  • MongoDB中的bson介绍和使用实例

    一.什么是bson BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型. BSON可以做为网络数据交换的一种存储形式,这个有点类似于Google的Protocol Buffer,但是BSON是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想,BSON有三个特点:轻量性.可遍历性.高效性, {"hello&q

  • MongoDB中实现多表联查的实例教程

    前些天遇到一个需求,不复杂,用 SQL 表现的话,大约如此: SELECT * FROM db1 LEFT JOIN db2 ON db1.a = db2.b WHERE db1.userId='$me' AND db2.status=1 没想到搜了半天,我厂的代码仓库里没有这种用法,各种教程也多半只针对合并查询(即只筛选 db1,没有 db2 的条件).所以最后只好读文档+代码尝试,终于找到答案,记录一下. 我们用 mongoose 作为连接库 联查需要用 $lookup 如果声明外键的时候用

  • MongoDB 管道的介绍及操作符实例

    MongoDB 管道的介绍及操作符实例 一 介绍 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数. MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理.管道操作是可以重复的. 表达式:处理输入文档并输出.表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档. 这里我们介绍一下聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档. $m

  • MongoDB中4种日志的详细介绍

    前言 任何一种数据库都有各种各样的日志,MongoDB也不例外.MongoDB中有4种日志,分别是系统日志.Journal日志.oplog主从日志.慢查询日志等.这些日志记录着MongoDB数据库不同方面的踪迹.下面分别介绍这几种日志. 系统日志 系统日志在MongoDB数据库中很重要,它记录着MongoDB启动和停止的操作,以及服务器在运行过程中发生的任何异常信息. 配置系统日志的方法比较简单,在启动mongod时指定logpath参数即可 mongod -logpath=/data/log/

  • MongoDB中aggregate()方法实例详解

    目录 前言 1,了解aggergate()方法 2,实现聚合表达式运算符 总结 前言 MongoDB的一个很大的好处是能够使用MapReduce来吧数据库查询的结果简化成一个与原来的集合完全不同的结构.MapReduce把一个数据库查询的值映射为一个完全不同的形式,然后简化结果,使它们的可用性更好. MongoDB有一个MapReduce框架,它也允许你使用聚合来简化吧一个MapReduce操作传输到另一个MapReduce操作的一系列过程.有了MapReduce和聚合,可以用数据生成一些不平凡

  • mongodb中oplog介绍和格式详析

    目录 1. 基本概念 2. Oplog 的默认储存大小 3. 可能需要更大oplog的工作负载 4. Oplog状态 5. Oplog格式 6. CUD操作和Oplog的对应关系 delete操作 update操作 小结 总结 1. 基本概念 oplog使用固定大小集合记录了数据库中所有修改操作的操作日志(新增.修改和删除,无查询),mongodb收到修改请求后,先在主节点(Primary)执行请求,再把操作日志保存到oplog表中,其他从节点(Secondary)到主节点拉取oplog并在异步

  • MongoDB中强大的统计框架Aggregation使用实例解析

    听说项目里面Aggregation用的多,那就专门针对这个多多练习一下. 基本的操作包括: •$project - 可以从子文档中提取字段,可以重命名字段 •$match - 可以实现查找的功能 •$limit - 接受一个数字n,返回结果集中的前n个文档. •$skip - 接受一个数字n,丢弃结果集中的前n个文档.效率比较低,依然会遍历前n个文档. •$unwind - 可以将一个包含数组的文档切分成多个, 比如你的文档有 中有个数组字段 A, A中有10个元素, 那么经过 $unwind处

  • Node.js对MongoDB进行增删改查操作的实例代码

    MongoDB简介 MongoDB是一个开源的.文档型的NoSQL数据库程序.MongoDB将数据存储在类似JSON的文档中,操作起来更灵活方便.NoSQL数据库中的文档(documents)对应于SQL数据库中的一行.将一组文档组合在一起称为集合(collections),它大致相当于关系数据库中的表. 除了作为一个NoSQL数据库,MongoDB还有一些自己的特性: •易于安装和设置 •使用BSON(类似于JSON的格式)来存储数据 •将文档对象映射到应用程序代码很容易 •具有高度可伸缩性和

  • java连接mongoDB并进行增删改查操作实例详解

    本文实例讲述了java连接mongoDB并进行增删改查操作.分享给大家供大家参考,具体如下: 1.安装 MongoDB JDBC驱动程序 在java中使用mongoDB之前,首先需要拥有java连接mongoDB的第三方驱动包(jar包) 1)maven项目可通过在pom.xml中添加依赖 <dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-ja

  • MongoDB 中Limit与Skip的使用方法详解

    MongoDB 中Limit与Skip的使用方法详解 一 MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数. 语法 limit()方法基本语法如下所示: >db.COLLECTION_NAME.find().limit(NUMBER) 实例 > db.col.find({},{"title":1,_id:0}).li

随机推荐