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

我刚刚开始使用MongoDB,我注意到的一件事是,它使用布森在内部存储数据。然而,文档并没有明确说明什么是BSON以及如何在MongoDB中使用它。有人能给我解释一下吗?

109701 次浏览

布森是MongoDB在集合中存储文档时使用的类JSON文档的二进制编码。它添加了对JSON中不支持的数据类型(如DATE和BINARY)的支持。

在实践中,在使用MongoDB时,您不必了解太多关于BSON的知识,您只需要在构造文档时使用您的语言的原生类型及其驱动程序提供的类型(例如ObjectID),它们将由驱动程序映射到适当的BSON类型。

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

通过在JSON上使用BSON编码,MongoDB能够在原始格式的JSON文档中的值上创建索引。这有助于运行高效的分析查询,因为众所周知,NoSQL系统不支持索引。

  • ABC_0的_是

    什么?

    BSON[BEE·Sahn]是bin ary JSON的缩写,是一种bin ary-en编码 JSON类文档系列。

  • 它与JSON

    有何不同?

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

    BSON还被设计为快速编码和解码。例如,整数存储为32(或64)位整数,因此不需要将它们解析为文本或从文本解析为整数。对于小整数,这比JSON使用更多的空间,但解析速度要快得多。

    除了紧凑性之外,BSON还添加了JSON中没有的其他数据类型,特别是BINDATA日期数据类型。

资料来源:http://bsonspec.org/.

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

BSON扩展了JSON模型,以提供其他数据类型,如日期和二进制,它不是在JSON中支持还提供有序字段,以便在不同语言中有效地进行编码和解码。

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

MongoDB用作JSON的序列化格式包括存储和访问文档的编码格式。简单地说,BSON是JSON数据的二进制编码格式。

更多MongoDB文章:https://om9x.com/blog/bson-vs-json/

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

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

在我的用例中,那篇文章告诉我,序列化到JSON对我来说是可行的,我不需要序列化到BSON.

严格保持在OP问题的范围内:

  1. 什么是BSON?

BSON是一组丰富的标量类型(Int32、Int64、Decimal、Date等)和容器(Object,也称为Map和Array)的规范,因为它们可能出现在字节流中。没有";本机";BSON的字符串形式;它是一个字节[]规范。要使用此字节流,有许多可用的本地语言实现可以将字节流转换为适合该语言的实际类型。这些被称为编解码器。例如,在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

不涉及to-和from-字符串调用。没有解析器。在Java端捕获的DatesBigDecimalLong的数组在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规范只有字符串和“数字”。(省略bools和nulls等)。在JSON中,无法直接将longBigDecimal从发送方发送到接收方。他们都只是";数字";。此外,JSON没有普通字节数组的类型。所有非ASCII数据必须是Base64或以其他方式编码以保护它,并作为字符串发送。BSON具有字节数组类型。生产者设定,消费者得到。没有对字符串进行二次处理以将其转换回所需类型。

  1. MongoDB如何使用BSON?

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