什么是BSON,它与JSON有何不同?

时间:2012-09-15 14:40:29

标签: json mongodb bson nosql

我刚刚开始使用MongoDB,我注意到的一件事是它使用BSON在内部存储数据。但是,关于BSON是什么以及如何在MongoDB中使用它的文档并不完全清楚。有人可以向我解释一下吗?

7 个答案:

答案 0 :(得分:111)

BSON是MongoDB在集合中存储文档时使用的类JSON文档的二进制编码。它增加了对JSON不支持的Date和binary等数据类型的支持。

实际上,在使用MongoDB时,您不必了解BSON,在构造文档时,您只需要使用语言的本机类型和驱动程序提供的类型(例如ObjectId),它们将是由驱动程序映射到适当的BSON类型。

答案 1 :(得分:21)

  • 什么是 BSON

      BSON [bee·sahn]是二进制JSON的缩写,是二进制编码的   类似JSON的文档的序列化。

  • JSON 有何不同?

  

BSON旨在提高空间效率,但在某些情况下效率不比JSON高。在某些情况下,BSON使用比JSON更多的空间。其原因是另一个BSON设计目标:可穿越性。 BSON为文档添加了一些“额外”信息,如字符串和子对象的长度。这使遍历更快。

     

BSON还可以快速编码和解码。例如,整数存储为32(或64)位整数,因此不需要对文本进行解析。对于小整数,这使用比JSON更多的空间,但解析起来要快得多。

     

除了紧凑性之外,BSON还添加了JSON中不可用的其他数据类型,特别是 BinData Date 数据类型。

来自http://bsonspec.org/

答案 2 :(得分:12)

MongoDB在幕后以二进制编码格式表示称为BSON的JSON文档。 BSON扩展了JSON模型以提供其他数据类型,并且可以有效地在不同语言中进行编码和解码。

答案 3 :(得分:7)

MongoDB以二进制编码格式表示 JSON文档,因此我们将其称为 BSON幕后

BSON扩展了JSON模型,以提供 JSON和不支持的其他数据类型,例如日期和二进制,还提供了有序字段。

可以有效地在不同语言中进行编码和解码。

换句话说,我们可以说 BSON只是二进制JSON (JSON的超集,其中包含更多数据类型,最重要的是二进制字节数组)。

Mongodb用作JSON的序列化格式,其中包含用于存储和访问文档的编码格式。我们可以简单地说BSON是JSON数据的二进制编码格式。

有关更多mongoDB文章:https://om9x.com/blog/bson-vs-json/

答案 4 :(得分:4)

通过在JSON之上使用BSON编码,MongoDB可以在原始格式的JSON文档中驻留的值之上创建索引。这有助于运行有效的分析查询,因为已知NoSQL系统不支持索引。

答案 5 :(得分:1)

这篇相对简短的文章很好地解释了BSON和JSON:它讨论了JSON的一些问题,发明BSON的原因,与JSON相比解决了哪些问题以及如何使您受益。

https://www.compose.com/articles/from-json-to-bson-and-back/

在我的用例中,该文章告诉我,对我来说序列化为JSON即可,我不需要序列化为BSON

答案 6 :(得分:0)

要严格遵守OP问题的范围:

  1. 什么是BSON?

BSON是对一组标量类型(int32,int64,十进制,日期等)以及容器(对象也称为映射和数组)的规范,它们可能出现在字节流中。没有BSON的“本机”字符串形式;是byte []规范。要使用此字节流,有许多可用的本机语言实现方式,可以将字节流转换为适合该语言的实际类型。这些称为编解码器。例如,从MongoDB到Document类的BSON编解码器的Java实现将对象转换为实现java.util.Map的对象。日期被解码为java.util.Date。在Java和python中,传输BSON看起来像这样:

Java:
import org.bson.*;
MyObject  -->  get() from MyObject, set() into org.bson.Document --> org.bson.standardCodec.encode(Document) to byte[]

XMIT byte[]

python:
import bson
byte[] --> bson.decode(byte[]) to dict --> get from dict --> do something

不涉及到和从字符串的调用。没有解析器。关于空格,双引号和转义字符没有任何内容。 DatesBigDecimal和在Java端捕获的Long数组在python中重新显示为datetime.datetimeDecimalint数组。

相比之下,JSON是一个字符串。没有用于JSON的编解码器。传输JSON如下所示:

MyObject --> convert to JSON (now you have a big string with quotes and braces and commas)

XMIT string

parse string to dict (or possibly a class via a framework) 

表面上看起来是一样的,但标量的JSON规范仅包含字符串和“数字”(省略了布尔值和null等)。没有直接方法可以通过JSON从发送方向接收方发送longBigDecimal;它们都只是“数字”。此外,JSON没有用于普通字节数组的类型。所有非ASCII数据都必须使用base64或以其他方式编码以保护它,并以字符串形式发送。 BSON具有字节数组类型。生产者设置它,消费者得到它。无需对字符串进行二次处理即可将其恢复为所需的类型。

  1. MongoDB如何使用BSON?

首先,它是内容的有线协议。它也是数据的磁盘格式。因为在BSON规范中,不同的长度类型(最明显的是字符串)携带长度信息,所以这允许MongoDB有效地遍历对象(在字段之间跳跃)。在集合中查找对象不仅仅是BSON(包括使用索引)。