MongoDB 中如何存储二进制数据

阅读时长 4 分钟读完

MongoDB 是目前非常流行的文档数据库,而在实际开发中,我们很可能需要存储一些二进制数据,例如图片、音频、视频等,那么在 MongoDB 中如何实现呢?

BSON 的数据类型

在 MongoDB 中,所有的数据都是以 BSON 格式存储的,BSON 即 Binary JSON,是一种类 JSON 的二进制数据交换格式。

BSON 支持的数据类型包括:

  • double:IEEE 754 格式的浮点数。
  • string:UTF-8 编码的字符串。
  • object:一组键值对。
  • array:一组值的有序列表。
  • binary data:二进制数据。
  • ObjectId:一个 12 字节的 MongoDB 对象 ID。
  • boolean:true 或 false。
  • date:表示自 1970 年 1 月 1 日 以来的毫秒数。
  • null:null 值。
  • regular expression:正则表达式。
  • JavaScript code:JavaScript 代码。
  • symbol:符号。
  • JavaScript code with scope:JavaScript 代码,可以包含作用域。
  • 32-bit integer:32 位整数。
  • timestamp:时间戳。
  • 64-bit integer:64 位整数。
  • decimal128:128 位十进制浮点数。
  • min key:指定最小键值。
  • max key:指定最大键值。

可以看到,在 BSON 支持的数据类型中,有一个 binary data 类型,它用于存储二进制数据。

存储二进制数据

存储二进制数据的方式有两种:

1. 直接存储二进制数据

直接存储二进制数据的方式比较简单,只需要将数据以二进制格式存储在一个字段中即可。

例如,我们可以定义一个文档类型为 image,用于存储图片数据:

其中,data 字段用于存储二进制数据,BinData 函数的第一个参数指定数据类型,0 表示一般的二进制数据。第二个参数即为二进制数据本身。

2. 存储二进制数据的 URL

另一种方式是将二进制数据存储在外部文件中,然后在 MongoDB 中存储文件的 URL 地址。

为了支持这种方式,MongoDB 内置了一个(GridFS)存储系统,它可以轻松地存储和检索超大型的二进制数据。

GridFS 中文件的存储方式类似于在文件系统中储存文件,每个文件会被分为多个块,存储在两个集合中:

  • fs.files:存储文件的元数据。
  • fs.chunks:存储文件块的二进制数据。

下面是一个使用 GridFS 存储二进制数据的示例:

-- -------------------- ---- -------
----- ---- - -------------------------
----- -------- - --------------------
----- ---- - -------------------------------------------------------------

--- ----
----------------- -- -- -
    --- - ------------- ----------------
---

----- --------- - -
    --------- ---------------
    ------------ -----------
--

-- ------ ------ -
----- ------ - --------------------------------------
----- ----------- - ---------------------------------
-------------------------

----------------------- ------ -- -
    ------------------------- - ---------
---

这里我们通过 createWriteStream 方法将数据流存入 GridFS 中,createWriteStream 方法的参数即为文件的元数据,包括文件名和文件类型等。

在存储完成后,我们可以从 fs.files 中查找到对应的文件信息。同样的,通过 createReadStream 方法可以从 GridFS 中读取二进制数据。

总结

通过本文的介绍,我们了解了 BSON 的数据类型,以及在 MongoDB 中存储二进制数据的两种方式:直接存储二进制数据和存储二进制数据的 URL。

在实际开发中,选择何种方式主要取决于业务场景和开发需求。同时,我们也可以结合 GridFS 存储系统来更方便地存储和检索超大型的二进制数据。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c1aee968c7c53b0b28af5

纠错
反馈