公告介绍 MongoDB 8.0,有史以来最快的 MongoDB! 阅读更多 >>介绍 MongoDB 8.0,有史以来最快的 MongoDB! >>

JSON是一种广泛使用的数据交换格式,在许多应用程序和技术堆栈中都很受欢迎。BSON,即 JSON 的二进制表示,主要在 MongoDB 内部用于高效存储和数据遍历。


目录

  • 什么是 JavaScript 对象表示法(JSON)?
  • MongoDB 与 JSON 的联系
  • 二进制 JSON 文档
  • MongoDB 使用 BSON 还是 JSON?
  • JSON 与 BSON
  • 模式灵活性和数据治理
  • 常见问题解答

什么是 JavaScript 对象表示法(JSON)?

JSON,或 JavaScript Object Notation,是一种人类可读的数据交换格式,于 2000 年代初期推出。尽管 JSON 基于 JavaScript 编程语言标准的子集,但它完全与语言无关。

JSON 对象是关联容器,其中字符串键映射到(该值可以是数字、字符串、布尔值、数组、空值——null,甚至是另一个对象)。几乎所有编程语言都支持这种抽象数据结构——JavaScript 中的对象、Python 中的字典、Java 和 C# 中的哈希表、C++ 中的关联数组等。


JSON 数据看起来是什么样子?

JSON 对象以人类可读的格式结构化,同时也易于应用程序读取。

{
  "_id": 1,
  "name": { "first" : "John", "last" : "Backus" },
  "contribs": [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
  "awards": [
    {
      "award": "W.W. McDowell Award",
      "year": 1967,
      "by": "IEEE Computer Society"
    }, {
      "award": "Draper Prize",
      "year": 1993,
      "by": "National Academy of Engineering"
    }
  ]
}

请注意,JSON 文件由逗号分隔的键值对组成,键值对使用冒号(:)表示。JSON 对象(文档)以花括号开始和结束。您可以使用任何支持的数据类型。上面的示例显示了双引号内的字符串、数字和数组(在方括号内)。

随着JavaScript成为网络开发的领先语言,JSON 开始独立发展。凭借其人类和机器可读性以及相对于其他语言实现支持的相对简单性,JSON 很快从网页扩展到软件的各个领域。

今天,JSON 出现在许多不同的场景中

  • API
  • 配置文件
  • 日志消息
  • 数据库存储

MongoDB 与 JSON 的联系

MongoDB 从一开始就被设计成一个以提供优秀的开发体验为重点的数据库。JSON 的普遍性使其成为表示 MongoDB 的 文档数据模型 中数据结构的明显选择。

使用MEAN和MERN等技术栈(如MEANMERN)构建应用程序更容易,因为开发人员可以从头到尾使用单一编程语言(JavaScript)。

然而,有几个问题使得JSON在数据库中使用时并不理想。

  1. JSON只支持有限的基本数据类型。最显著的是,JSON不支持日期和时间以及二进制数据。

  2. JSON对象和属性没有固定长度,这使得遍历速度变慢。

  3. JSON不提供元数据和类型信息,这使得检索文档的时间更长。

为了使MongoDB以JSON为第一选择,同时保持高性能和通用性,发明了BSON来弥合这一差距:一种用于存储数据为JSON文档的二进制表示,优化了速度、空间和效率。在方法上,它与Protocol Buffers或Thrift等其他二进制交换格式没有太大区别。

二进制 JSON 文档

BSON代表“二进制JSON”,这正是它被发明出来的目的。一个BSON文件是对应JSON文件的二进制表示。BSON的二进制编码序列化格式还编码了类型和长度信息,这使得它比JSON更快地被遍历。

BSON添加了一些额外的数据类型(非JSON原生),如日期和二进制数据,如果没有这些,MongoDB将缺少一些宝贵的支持。


BSON文件

以下是一些示例JSON对象及其对应的二进制JSON表示。

{"hello": "world"} →
\x16\x00\x00\x00           // total document size
\x02                       // 0x02 = type String
hello\x00                  // field name
\x06\x00\x00\x00world\x00  // field value
\x00                       // 0x00 = type EOO ('end of object')
 
{"BSON": ["awesome", 5.05, 1986]} →
\x31\x00\x00\x00
 \x04BSON\x00
 \x26\x00\x00\x00
 \x02\x30\x00\x08\x00\x00\x00awesome\x00
 \x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
 \x10\x32\x00\xc2\x07\x00\x00
 \x00
 \x00

您可以在BSON规范中了解更多关于BSON语法的知识。

MongoDB 使用 BSON 还是 JSON?

MongoDB以BSON格式存储数据,包括内部和网络传输。您可以像在JSON中一样表示任何内容,并轻松地存储在MongoDB中,并以JSON格式检索。


An image describing how MongoDB converts json data to bson data.

当使用您喜欢的编程语言的MongoDB驱动程序时,您将使用该语言的原生数据结构。您的应用程序需要将原生数据结构(例如,JavaScript对象或POJO)转换为JSON。然后MongoDB驱动程序负责在查询数据库时将数据从JSON转换为BSON以及反向转换。

与存储JSON为字符串编码值或二进制编码块的系统不同,MongoDB使用BSON在流行的网络数据格式上提供强大的索引和查询功能。

例如,MongoDB允许开发人员根据JSON/BSON文档中的特定键查询和操作对象,甚至在记录中嵌套很深的文档中,并可以在这些相同的键和值上创建高性能的索引。

首先,BSON文件可能包含纯JSON无法原生动表示的日期或二进制对象。

其次,每种编程语言都有自己的对象语义。例如,JSON对象有有序键,而Python字典(与JavaScript对象最相似的本机数据结构)是无序的,而数字和字符串数据类型之间的差异也可能发挥作用。第三,BSON支持多种不是JSON原生的数字类型,而许多语言对这些类型的表示方式不同。


EJSON

EJSON或扩展JSON是MongoDB中表示BSON值的一种与JSON兼容的方法。由于JSON仅支持BSON支持类型的一个子集,MongoDB在JSON格式中添加了一些扩展,即规范模式和宽松模式。MongoDB提供了serialize、deserialize、parse和stringify等EJSON方法。


解析JSON

当应用程序通过shell、API或MongoDB Atlas向MongoDB写入或更新数据时,MongoDB驱动程序将数据解析为BSON格式。解析涉及识别和解释JavaScript对象或JSON结构,将每个字段映射到正确的BSON数据类型,并转换值。当应用程序从MongoDB请求数据时,驱动程序将数据转换为JSON字符串,然后通过服务器发送。

检查您的驱动程序文档,以确保您了解如何在您的语言中最佳地访问MongoDB BSON支持的数据。

JSON 与 BSON

JSONBSON
编码UTF-8字符串二进制
数据支持字符串、布尔值、数字、数组、对象、null字符串、布尔值、数字(整数、浮点数、长整型、decimal128...)、数组、null、日期、BinData
可读性人类和机器机器仅

设计和JSON非常相似。BSON被设计为JSON数据的二进制表示,具有针对更广泛应用的特定扩展,并针对数据存储和遍历进行了优化。就像JSON一样,BSON支持嵌入对象和数组。

BSON与JSON的一个不同之处在于它支持一些更高级的数据类型。例如,JSON不会区分整数(圆整数)和浮点数(具有各种程度的十进制精度)。

大多数服务器端编程语言都有更复杂的数值类型(包括整数、标准精度的浮点数——即“float”——双精度浮点数——即“double”——和布尔值),每种类型都有其最优的使用方式以进行高效的数学运算。

模式灵活性和数据治理

对于使用JSON和BSON数据模型的数据库的开发者来说,他们最吸引人的特点之一是它们提供的动态和灵活的模式,与关系数据库使用的刚性表格数据模型相比。

首先,MongoDB文档是多态的——在单个集合内(类似于关系数据库中的表)的字段可以不同。这种灵活性使得对任何结构的数据建模更容易,并且可以随着需求的变化调整模型。

其次,无需向数据库声明文档的结构——文档是自描述的。开发者可以从编写代码开始,并在创建对象时将其持久化。

第三,如果需要向文档添加新字段,可以在不影响集合中所有其他文档的情况下创建它,无需更新中央系统目录,也无需将数据库离线。当您需要更改数据模型时,文档数据库继续存储更新后的对象,无需执行昂贵的ALTER TABLE操作——或者更糟,需要从头开始重新设计模式。

通过这些优势,文档数据模型的灵活性非常适合现代应用程序开发实践的需求。

虽然灵活的模式是一个强大的功能,但在某些情况下,您可能希望对文档的数据结构和内容有更多的控制。大多数文档数据库将执行这些控制的任务推回给开发者在应用程序代码中实现。然而,更高级的文档数据库提供了模式验证,例如MongoDB采用的IETF JSON Schema标准。现在尝试MongoDB Atlas在线体验!

常见问题解答

如何将BSON转换为JSON

您可以使用在线JSON工具在BSON和JSON之间进行转换。MongoDB还提供了bsondump工具,用于将BSON转换为JSON。

为什么使用BSON而不是JSON?

BSON相对于JSON有以下优势

  • BSON支持更多数据类型,如日期、时间和二进制数据。

  • BSON的二元结构允许更快的数据遍历和检索。

  • BSON提供额外的元数据,如长度和类型信息,从而加快搜索速度。

BSON JSON格式是什么?

BSON是JSON数据的二进制编码序列化。虽然JSON字符串是可读的,但BSON需要解析。BSON提供了更多数据类型、轻量级、可遍历和更有效地存储数据的好处。它还适用于许多编程语言的编码和解码。