ChatGPT解决这个技术问题 Extra ChatGPT

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

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


J
JohnnyHK

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

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


那么如果 mongoDb 将文档存储为 bson,当我们查询数据库时返回的类型是什么?它们是以 json 形式返回的吗?还是按原样返回 bson?
不,您的语言的 MongoDB 驱动程序负责将文档转换为适合您的语言的数据类型。尽可能使用原生数据类型。
这是否意味着,如果我使用 Javascript 从 BSON 文档中检索数据,我不会像使用 C/C++ 检索时那样获得任何数据类型差异,即如果没有任何小数,数字将被视为整数?
@abhisekp 根据 JohnnyHK 的解释和我最近的经验,我认为你说的是真的。
BSON 会返回列字段的确切数据类型吗?还是将其作为所有类型的字符串返回?
N
Nicola

什么是 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/


这是否与代表二进制 JSON 数据的数据类型 jsonb 相同,在 postgresql 中分解?
F
Fouad Boukredine

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

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

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

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

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


链接坏了
...答案是离轴的。 BSON 只是表面上与 JSON 相似,而这正是它被渲染为 toString() 的时候。
c
codergirl22

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


A
Anupam Mahapatra

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


H
HairOfTheDog

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

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

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


B
Buzz Moschetti

严格遵守 OP 问题的范围:

什么是 BSON?

BSON 是一组丰富的标量类型(int32、int64、十进制、日期等)以及可能出现在字节流中的容器(对象也称为映射和数组)的规范。 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 规范只有字符串和“数字”(省略了布尔值和空值等)。没有直接的方法可以在 JSON 中将 longBigDecimal 从发送方发送到接收方;他们都只是“数字”。此外,JSON 没有纯字节数组的类型。所有非 ASCII 数据必须是 base64 或以其他方式编码以保护它并作为字符串发送。 BSON 有一个字节数组类型。生产者设置它,消费者得到它。没有对字符串进行二次处理以将其转换回所需的类型。

MongoDB 如何使用 BSON?

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