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

Aks*_*rma 123 json mongodb nosql bson

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

Joh*_*yHK 132

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

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

  • 不,您的语言的MongoDB驱动程序负责将文档转换为适合您的语言的数据类型.尽可能使用本机数据类型. (11认同)
  • 因此,如果mongoDb将文档存储为bson,则在查询数据库时返回的类型是什么?它们是否以json返回?还是按原样返回bson? (2认同)
  • 这是否意味着,如果我使用_Javascript_从**BSON**文档中检索数据,我将不会获得任何数据类型的差异,因为当我使用_C/C++检索时我会得到_即数字将被视为**整数**如果它没有任何小数? (2认同)

Meh*_*ash 30

  • 什么是BSON?

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

  • 它与JSON有什么不同?

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

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

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

来自http://bsonspec.org/


小智 12

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


小智 10

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

BSON扩展了JSON模型,以提供JSON 中不支持的其他数据类型,例如Date和binary,还提供了有序字段,以使其能够有效地在不同语言中进行编码和解码。 

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

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

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


Hai*_*Dog 6

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

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

在我的用例中,该文章告诉我序列化为 JSON 对我有用,而且我不需要序列化为 BSON


小智 5

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


Buz*_*tti 5

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

  1. 什么是 BSON?

BSON 是一组丰富的标量类型(int32、int64、decimal、date 等)以及可能出现在字节流中的容器(对象又称为映射和数组)的规范。BSON 没有“原生”字符串形式;它是一个 byte[] 规范。为了使用此字节流,有许多可用的本机语言实现可以将字节流转换为适合该语言的实际类型。这些称为编解码器。例如,将 BSON 编解码器的 Java 实现Document从 MongoDB 转换为类,将对象转换为实现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
Run Code Online (Sandbox Code Playgroud)

不涉及到字符串和来自字符串的调用。没有解析器。没有任何关于空格、双引号和转义字符的内容。 在 Java 端捕获的 、 和 数组在 python 中重新出现为Dates、BigDecimal和的数组。Longdatetime.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) 
Run Code Online (Sandbox Code Playgroud)

从表面上看,这看起来是一样的,但标量的 JSON 规范只有字符串和“数字”(省略了布尔值和空值等)。没有直接的方法以 JSON 格式将 along或 aBigDecimal从发送者发送到接收者;它们都只是“数字”。此外,JSON 没有纯字节数组的类型。所有非 ASCII 数据都必须采用 base64 或以其他方式进行编码以保护数据并作为字符串发送。BSON 有一个字节数组类型。生产者设置它,消费者得到它。没有对字符串进行二次处理来将其变回所需的类型。

  1. MongoDB 如何使用 BSON?

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