【问题标题】:What is BSON and exactly how is it different from JSON?什么是 BSON,它与 JSON 究竟有何不同?
【发布时间】:2012-09-15 14:40:28
【问题描述】:

我刚开始使用 MongoDB,我注意到其中一件事是它使用 BSON 在内部存储数据。但是,文档并不清楚 BSON 是什么以及它在 MongoDB 中的使用方式。谁能给我解释一下?

【问题讨论】:

    标签: json mongodb bson nosql


    【解决方案1】:

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

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

    【讨论】:

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

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

    • 它与 JSON 有何不同?

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

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

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

    来源:http://bsonspec.org/

    【讨论】:

    • 这和数据类型jsonb一样吗,jsonb代表二进制JSON数据,在postgresql中分解?
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 链接失效
    • ... 答案是离轴。 BSON 只是表面上与 JSON 相似,也就是它被渲染为 toString() 的时候。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          严格控制在 OP 问题的范围内:

          1. 什么是 BSON?

          BSON 是一组丰富的标量类型(int32、int64、十进制、日期等)以及可能出现在字节流中的容器(对象也称为映射和数组)的规范。 BSON 没有“本机”字符串形式;它是一个字节 [] 规范。要使用此字节流,有许多可用的本地语言实现可以将字节流转换为适合该语言的实际类型。这些被称为编解码器。例如,从 MongoDB 到 Document 类的 BSON 编解码器的 Java 实现将对象转换为实现 java.util.Map 的东西。日期被解码为java.util.Date。传输 BSON 在例如 Java 和 python 中如下所示:

          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 有一个字节数组类型。生产者设置它,消费者得到它。无需对字符串进行二次处理即可将其转回所需的类型。

          1. MongoDB 如何使用 BSON?

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

          【讨论】:

            猜你喜欢
            • 2016-05-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-28
            • 2012-08-27
            • 2010-11-12
            • 2011-03-18
            相关资源
            最近更新 更多