191

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

4

7 回答 7

184

BSON是 MongoDB 在将文档存储在集合中时使用的类 JSON 文档的二进制编码。它增加了对 JSON 中不支持的数据类型(如日期和二进制)的支持。

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

于 2012-09-15T14:50:29.747 回答
60
  • 什么是BSON

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

  • 它与JSON有何不同?

    BSON 旨在提高空间效率,但在某些情况下并不比 JSON 效率高多少。在某些情况下,BSON 使用的空间甚至比 JSON 还要多。这样做的原因是 BSON 的另一个设计目标:可遍历性。BSON 将一些“额外”信息添加到文档中,例如字符串和子对象的长度。这使得遍历更快。

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

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

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

于 2017-03-14T11:51:08.570 回答
19

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

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

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

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

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

于 2018-08-31T15:20:04.090 回答
16

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

于 2014-07-21T11:19:19.973 回答
6

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

于 2017-01-12T15:50:48.513 回答
4

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

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

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

于 2019-10-23T18:18:22.850 回答
4

严格遵守 OP 问题的范围:

  1. 什么是 BSON?

BSON 是一组丰富的标量类型(int32、int64、十进制、日期等)以及可能出现在字节流中的容器(对象也称为映射和数组)的规范。BSON 没有“本机”字符串形式;它是一个字节 [] 规范。要使用此字节流,有许多可用的本地语言实现可以将字节流转换为适合该语言的实际类型。这些被称为编解码器。例如,Document从 MongoDB 到类的 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 端捕获的 、 和 数组 在 python 中重新出现DatesBigDecimal、和数组。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) 

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

  1. MongoDB 如何使用 BSON?

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

于 2020-08-13T22:56:46.867 回答