-1

众所周知,mongodb 节点客户端允许我们插入 javascript 数据:

collection.insert({
  alpha: 123,
  bravo: "hello",
  charlie: [1, 2, 3],
})

我的问题:mongo 是否支持较新的 js 类型,例如 BigInt 和 ArrayBuffers?

collection.insert({
  delta: 789623812637812637812631283712983n, // ???
  echo: new Uint8Array([1, 2, 3, 4]).buffer, // ???
})

我在哪里可以找到有关 mongo 对 JS 数据类型的支持以及它们是如何被强制的信息?我找到了这个文档,但是对于理解 javascript 类型将如何被强制转换似乎一点用都没有

我目前最关心 ArrayBuffers:mongodb 会自动将 ArrayBuffers 强制为 BSON“BinData”吗?当我检索我的 mongodb 文档时,我会取回我插入的相同 ArrayBuffers,还是将它们强制转换为新类型?我是否需要在我的应用程序的 ArrayBuffers 和一些与 mongodb 兼容的数据类型之间来回摆动?

4

2 回答 2

2

您找到的文档https://docs.mongodb.com/manual/reference/bson-types/中列出了 MongoDB 服务器理解的类型。服务器不理解也不接受任何其他类型。

您的应用程序不直接与服务器对话,而是通过驱动程序进行对话。驱动程序负责将您的编程语言的基本类型转换为服务器可以理解的 bson 类型。有时这种转换很简单,有时则不然。例如,唯一的 bson 字符串类型需要 utf-8 编码,驱动程序可能会强制输入字符串。类似地,像 Ruby 和 Python 这样的语言包含一个可以包含任意大值的整数类型。驱动程序将这些值转换为两种 bson 整数类型(32 位或 64 位)之一,如果值太大则错误。

基本语言类型通常不包括语言标准库定义的所有类型(例如,各种集合类型可能仅在它们提供到基本语言数组或映射的自动转换的范围内受支持)。

您的驱动程序或其他相关库可能会提供用于定义其他类型转换的工具。例如,Mongoid 通过自定义字段来做到这一点。

请查阅您的驱动程序文档以了解提供了哪些类型转换以及它们如何工作。Ruby 示例:https ://docs.mongodb.com/ruby-driver/master/tutorials/bson-v4/#supported-classes

于 2021-04-14T18:05:59.673 回答
0

缺少有关 javascript 类型支持的 mongodb 节点驱动程序文档

  • 没有关于 mongodb 节点驱动程序如何解释或强制 javascript 原语或标准对象的文档

  • js-bson 1.1.6 更新日志提到bigint不支持

    • “如果检测到 bigint 值,库现在将抛出错误”
    • 这个Long类有一个fromBigInt功能
  • javascript ArrayBuffer 的处理未记录在案

    • 传闻可能和bigint类似,抛出错误
    • 虽然不直接支持,但可以将 arraybuffer 转换为 bson 二进制对象,方法是首先将 arraybuffer 转换为节点缓冲区
      import {Binary} from "mongodb"
      
      const arrayBuffer = new ArrayBuffer()
      const nodeBuffer = Buffer.from(arrayBuffer)
      const mongoBinary = Binary(nodeBuffer)
      
      collection.insertOne({mongoBinary})
      
于 2021-04-15T16:27:51.590 回答