MongoDB 中如何存储二进制数据

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


猜你喜欢

  • 解决 Deno 中编码问题引起的中文乱码

    在 Deno 中,我们常常会在读取、写入文件、网络传输等场景下遇到中文乱码的问题。这是因为 Deno 默认使用 UTF-8 编码,而在一些场景下,我们需要使用其他编码方式进行操作。

    1 年前
  • ECMAScript 2020 中的新型数据结构

    在 ECMAScript 2020 中,我们看到了许多新的有趣的特性,其中一个很重要的变化是全新的数据结构,这些新的数据结构可以帮助我们更有效地编写 JavaScript 代码。

    1 年前
  • 前端自动化测试神器:React 测试工具 Enzyme

    介绍 自动化测试是前端开发流程中不可或缺的一环,它能够帮助我们在开发过程中发现代码中的问题,提高代码质量,避免在生产环境中发生困扰用户的错误。React 前端框架的越来越受欢迎,因此有许多测试工具可以...

    1 年前
  • ES10 中新增的 Symbol.prototype.description 属性提高 Symbol 的应用性

    在 ES10 中,新增了 Symbol.prototype.description 属性,用于获取 Symbol 的描述信息。这一变化提高了 Symbol 的应用性,使其在一些场景中变得更加方便实用。

    1 年前
  • 基于 Hapi 框架集成 Passport 实现用户认证授权实践

    在 Web 应用程序的开发中,用户认证和授权是不可避免的一部分,这对于前端工程师来说是十分重要的技能。本文将介绍如何使用 Hapi 框架和 Passport 库来实现用户认证和授权。

    1 年前
  • Tailwind 框架如何实现自定义颜色

    前言 Tailwind 是一款非常流行的前端框架,它可以帮助开发者快速搭建出漂亮、现代化的用户界面。其中,自定义颜色是 Tailwind Framework 最常用的一个特性之一。

    1 年前
  • 利用 ES6 中的 Symbol 实现类之间的继承

    前言 在 ES6 之前,JavaScript 没有从语法上提供面向对象编程(OOP)实现方式,但是面向对象编程的实现方式可以使用 JavaScript 的原型链来实现。

    1 年前
  • Headless CMS 如何实现分布式架构下的数据同步

    传统的 CMS 一般采用单体式架构,数据存储和表现层都在同一应用中。但是这种架构不利于分散性质的应用、高可用性部署以及数据安全。Headless CMS 引入了分布式架构来解决这些问题,并通过增加 A...

    1 年前
  • 利用 Jest 测试正则表达式

    正则表达式是前端开发中重要的一部分,但是很容易写出有缺陷的正则表达式,因此测试是非常必要的。 Jest 是一个流行的 JavaScript 测试框架,允许我们在前端开发中测试正则表达式,确保表达式的正...

    1 年前
  • ES6 中的 Promise 的使用

    在现代前端开发中,我们经常需要处理异步操作,这些异步操作包括网络请求、定时任务和其他一些需要等待的操作。ES6 中的 Promise 就是为了解决这个问题而出现的。

    1 年前
  • ES9 中的对象 Rest/Spread 属性用法详解

    ES9 中的对象 Rest/Spread 属性用法详解 随着 JavaScript 语言的不断发展,ES9 中新增了一些对象属性的操作方法,其中不容忽视的一个是 Rest/Spread 属性。

    1 年前
  • 使用 RxJS 处理用户输入

    随着 Web 应用变得越来越复杂,我们经常需要处理大量的用户输入。传统的事件处理方式很快就会变得难以管理和维护。而使用响应式编程(Reactive Programming)可以极大地简化这个过程。

    1 年前
  • Promise 如何处理表单验证

    Promise 如何处理表单验证 表单验证是Web开发中必不可少的一部分,通过对用户提交的数据做一些必要的判断,可以有效避免不必要的错误和数据安全问题。在前端开发中,Promise成为了使用表单验证的...

    1 年前
  • SASS 基础语法学习及用例详解

    SASS 基础语法学习及用例详解 SASS 是一款强大的 CSS 预处理器,它可以帮助前端开发人员更加高效地编写 CSS。本文将介绍 SASS 的基础语法,并通过实际用例来帮助读者深入理解。

    1 年前
  • Vue.js 中的图表和可视化

    Vue.js 是一个流行的前端框架,它能够处理大量数据并快速呈现它们,从而满足数据可视化和信息呈现的需要。除此之外,Vue.js 支持多种图表和可视化库,使开发者可以轻松地创建各种可视化展示。

    1 年前
  • 在 Mocha 中使用 Jest 对 Redux 进行测试

    前言 随着Web应用的日益复杂,前端架构也变得越来越重要。Redux 是一个流行的状态管理库,它提供了一个可预测的状态管理方案。但是,与其它库一样,Redux 的开发和维护需要进行有效的测试。

    1 年前
  • Socket.io 使用及调试工具介绍

    一、什么是 Socket.io? Socket.io 是一款实时的双向通信库,它基于 WebSocket 协议来实现客户端和服务器之间的实时通信。相比于传统的轮询方式,Socket.io 可以更加高效...

    1 年前
  • # 如何在 LESS 中使用变量实现颜色渐变

    如何在 LESS 中使用变量实现颜色渐变 前端开发中,颜色渐变是常见且重要的设计元素之一。而 LESS 是一种 CSS 预处理器,它提供了一套灵活的变量和 mixin 等功能,让我们能够更方便地编写 ...

    1 年前
  • Webpack 打包后页面样式错乱的解决方法

    当我们使用 Webpack 对前端项目进行打包时,可能会遇到页面样式错乱的问题。这是由于 Webpack 默认将 CSS 文件打包到 JS 文件中,而浏览器解析 CSS 时需要用到对应的链接,导致样式...

    1 年前
  • 解决 Fastify 中的内存不足问题

    前言 Fastify 是一个高效的 Web 框架,但是在处理大量请求的时候会出现内存不足的问题。本文将介绍如何在 Fastify 中解决内存不足问题。 原理 Fastify 内存不足的原因是因为在处理...

    1 年前

相关推荐

    暂无文章