MongoDB World is back in NYC June 7 - 9!

JSON是一种广泛使用的数据交换格式,深受众多应用程序和技术堆栈的青睐。BSON 是 JSON 的二进制表示法,主要用于 MongoDB 内部的高效存储和数据遍历。


目录

什么是 JavaScript Object Notation?

JSON,或 JavaScript Object Notation,是一种人类可读的数据交换格式,于 2000 年代初引入。尽管 JSON 源自 JavaScript 编程语言的子集,但它完全独立于语言。

JSON objects 是关联容器,其中一个字符串键被映射到一个 value(可以是数字、字符串、布尔值、数组、空值 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 文档数据模型 中的数据结构的明智之选。

使用 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中一样简单。


描述 MongoDB 如何将 json 数据转换为 bson 数据的图片。

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

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

例如,MongoDB 允许开发者通过 JSON/BSON 文档内的特定键查询和操作对象,即使在记录深度多层的嵌套文档中,也可以在相同的键和值上创建高性能索引。

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

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


EJSON

EJSON 或 扩展 JSON 是一种在 MongoDB 中表示 BSON 值的 JSON 兼容方式。 由于 JSON 仅支持 BSON 所支持的类型的子集,因此 MongoDB 对 JSON 格式进行了某些扩展,即规范模式和宽松模式。 MongoDB 为 EJSON 提供了序列化、反序列化、解析和字符串化等方法。


解析 JSON

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

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

JSON vs BSON

JSONBSON
EncodingUTF-8 stringBinary
Data SupportString, boolean, number, array, object, nullString, boolean, number (integer, float, long, decimal128...), array, null, date, BinData
ReadabilityHuman and machineMachine only

JSON 和 BSON 在设计上确实是近亲。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?

与 JSON 相比,BSON 具有以下优势:

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

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

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

BSON JSON 格式是什么?

BSON 是 JSON 数据的二进制编码序列化。JSON 字符串是人类可读的,而 BSON 则需要解析才能理解。BSON 还具有数据类型多、量级轻和可遍历以及更有效地存储数据等额外优势。它在多种编程语言中的编码和解码效率都很高。