BSON的介绍及BSON与JSON的区别

BSON的介绍及BSON与JSON的区别说明新公司在用 MongoDB 由于使用 MongoDB 时其中有一个很重要的类 Document 翻看源码时发现他实现了 Bson 本人之前对其不了解 故而有了这篇文章 概念参考百科说明 BSON BinarySerial 是一种二进制形式的存储格式 采用了类似于 C 语言结构体的名称 对表示方法 支持内嵌的文档对象和数组对象 具有轻量性 可遍历性

说明

新公司在用MongoDB,由于使用MongoDB时其中有一个很重要的类Document,翻看源码时发现他实现了BSON,本人之前对其不了解,故而有了这篇文章。

概念

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

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




例子

一个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对组成的

一个嵌套的例子

{     name:"lemo",     age:"12",     address:{         city:"suzhou",         country:"china",         code:     } ,     scores:[         {"name":"english","grade:3.0},         {"name":"chinese","grade:2.0}     ] }

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





与JSON的区别

以下内容参考自  http://blog.csdn.net/z/article/details/ 感谢谢原作者。
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是mongodb的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

BSON主要会实现以下三点目标:
(1)更快的遍历速度
对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。
(2)操作更简易
对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。
(3)增加了额外的数据类型
JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。















但是,在有的时候,
BSON相对JSON来说也并没有空间上的优势,比如对{“field”:7},在JSON的存储上7只使用了一个字节,而如果用BSON,那就是至少4个字节(32位)

目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。







版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176621.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:28
下一篇 2026年3月26日 下午9:28


相关推荐

  • Java–Java版本和JDK版本「建议收藏」

    Java–Java版本和JDK版本「建议收藏」对于Java初学者,经常会听到同事,或看到网上Java版本和JDK版本不一的叫法,不明白这两者到底什么关系?其实博主当年初学Java时也有这样的困惑,今天我们就来好好探讨一下,如有不对之处,请加以指正,不喜勿喷,谢谢!Java版本叫法:Java6、Java8、Java11、Java13(当前最新版本Java17)等这一类“JavaX”的Java版本名称同时又会听到,看到JDK版本叫法:JDK1.6、JDK1.8等这种“J…

    2025年11月26日
    4
  • Pycharm的基本使用以及如何配置Python运行环境

    Pycharm的基本使用以及如何配置Python运行环境编译器介绍 Pycharm 一个 code 编译器 主要用于 python 语言开发 功能很强大 有社区版本和专业版本 付费 社区版是提供给编程爱好者进行学术交流的 所以它免费的 功能不如专业版强大 专业版需要付费 但专业版可以激活成功教程 如果不想激活成功教程可以选择 VScode 等其他编译器 具体选择根据个人情况而定 编译器的基本使用首次打开编译器 会看到新手指引 可以根据这个新手指引快速上手 如果不想看可以直接关掉 code 样式设置路径 file Settings Editor General F

    2026年3月27日
    3
  • shell-2.shell定义变量

    shell-2.shell定义变量

    2021年9月14日
    52
  • chcp 使用及解析

    chcp 使用及解析Win R gt 进入 cmd 命令行 chcp nbsp 显示活动控制台代码页数量 或更改该控制台的活动控制台代码页 如果在没有参数的情况下使用 则 chcp 显示活动控制台代码页的数量 nbsp 语法 nbsp chcp nnn nbsp 参数 nbsp 指定代码页 下表列出了所有支持的代码页及其国家 地区 或者语言 nbsp 代码页 nbsp nbsp nbsp nbsp nbsp nbsp 国家 地区 或语言 nbsp 437 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 美国 nbsp 708 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 阿拉伯文 ASMO7

    2026年3月19日
    2
  • linux怎么查看jdk的安装版本和安装路径_yum查看已安装的软件

    linux怎么查看jdk的安装版本和安装路径_yum查看已安装的软件打开终端,输入java-version即可显示当前系统的jdk版本打开终端,输入java-verbose即可显示当前系统的jdk的安装位置

    2026年2月23日
    7
  • 下载jieba 库[通俗易懂]

    下载jieba 库[通俗易懂]步骤:1.打开命令行2.联网3.在C:\Users\User>后面加语句 pipinstalljieba形成 C:\Users\User>pipinstalljieba然后按回车,然后就开始安装在最后一行出现Successfullyinstalledjieba-0.39 证明安装成功  PS由于我们用pip来安装的jieba库嘛…

    2026年2月7日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号