热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BSON格式解释

BSON(BinarySerializedDocumentFormat)是一种二进制形式的存储格式,采用了类似于C语言结构体的名称、对表示方法,支持内嵌

BSON( Binary Serialized Document Format) 是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的特点,可以有效描述非结构化数据和结构化数据。


概念

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等类型。


折叠编辑本段使用情况

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

MongoDB以BSON做为其存储结构的一种重要原因是其可遍历性。


折叠编辑本段几个例子

3.1 一个Document的BSON表示

{

title:"MongoDB",

last_editor:"192.168.1.122",

last_modified:new Date("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}

]

}

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


折叠编辑本段代码分析

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 &#61; b.obj();

或者用宏来创建一个对象

BSONObj p &#61; BSON( "name" <<"Joe" <<"age" <<33 );

这里分析一下这四个类的一些代码:

mongo::BSONObj主要是用于存储BSON对象的&#xff0c;具体的存储格式如下

{}* EOO

-------------------- ------------- ----------------- ---- ---

totalSize: 一个总的字节长度&#xff0c;包含自身

BSONType: 对象类型,这里有Boolean,String,Date等类型&#xff0c;具体可以参考bsontypes.h这个文件

FieldName: 这里表示字段名

Data: 这里是放具体的数据&#xff0c;数据的存储方式根据不同的BSONType来

* : 表示可以有多个元素组成

EOO: 这是一个结束符&#xff0c;一般是/x00来表示

一般来说&#xff0c;BSONObj的创建都是通过BSONObjBuilder来做的&#xff0c;除非你已经得到了其字节流&#xff0c;那可以直接生成BSONObj

mongo::BSONElement 它主要是用于存储对象中的单个元素&#xff0c;存储格式如下

这个对象主要是指向BSONObj对象中具体元素的地址&#xff0c;它不实际存储元素的值。

mongo::BSONObjBuilder 它主要是用于生成BSONObj&#xff0c;这个对象集成了StringBuilder,它主要用于存储实际的字节点&#xff0c;用于替换std::stringstream&#xff0c;而这个StringBuilder集成了BufBuilder,这是一个可以动态增长内存缓冲区&#xff0c;但最大容量不能超过64MB的大小&#xff0c;也就是说一个BSONObj最大不能超过64MB。

mongo::BSONOBjIterator 它主要是用来遍历BSONObj对象中的每一个元素&#xff0c;提供了类似于stl iterator的一些接口&#xff0c;它还提供了一个ForEach宏来提供更方便的操作。

 


推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
author-avatar
董士伟的微博当_250
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有