MongoDB教程(二十一):MongoDB大文件存储GridFS

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、GridFS 概述
      • 二、GridFS 的组成
      • 三、使用 GridFS
        • 1. 导入 GridFS 模块
        • 2. 创建 GridFS Bucket
        • 3. 存储文件
        • 4. 检索文件
      • 四、案例:存储和检索图片
        • 1. 创建 GridFS Bucket
        • 2. 存储图片
        • 3. 检索图片
      • 五、GridFS 的优势与局限
        • 优势
        • 局限
      • 六、结论

引言

在处理多媒体文件、文档或其他大型二进制数据时,传统的文件存储方式往往难以满足高并发、可扩展和易管理的需求。MongoDB 通过 GridFS 模块提供了一套完整的解决方案,用于存储和检索大型文件。本文将深入探讨 GridFS 的工作原理,以及如何在 MongoDB 中使用 GridFS 存储和检索文件。

一、GridFS 概述

GridFS 是 MongoDB 的一个规范,用于存储和检索超过 MongoDB 单个文档大小限制(16MB)的文件。GridFS 并不是 MongoDB 的一部分,而是由 MongoDB 社区开发的,旨在提供一种简单、可靠的文件存储方式。GridFS 将文件拆分为多个小块存储,每个小块不超过 255KB,并为每个小块创建一个文档,同时为整个文件创建一个元数据文档。

二、GridFS 的组成

GridFS 主要由两个集合组成:

  • fs.files:存储文件的元数据,如文件名、长度、上传时间等。
  • fs.chunks:存储文件的实际数据,每个文件被拆分为多个小块,每个小块对应 fs.chunks 集合中的一个文档。

三、使用 GridFS

1. 导入 GridFS 模块

在 MongoDB shell 中,可以直接使用 GridFS 功能,但在使用 JavaScript 或其他编程语言的驱动程序时,需要导入相应的 GridFS 模块。

2. 创建 GridFS Bucket

在 MongoDB 3.4 及以后的版本中,引入了 GridFS Bucket,它提供了一个更简洁的 API 来使用 GridFS。

// MongoDB Shell
const fs = new FSBucket(db, { bucketName: "myFiles" });
3. 存储文件

使用 GridFS 存储文件非常直观,可以将文件流或 Buffer 对象传递给 uploadFromStreamuploadFromBuffer 方法。

// MongoDB Shell
const fs = new FSBucket(db, { bucketName: "myFiles" });

// 假设 'file' 是一个文件流
const fileId = await fs.uploadFromStream("myFile.txt", file);
4. 检索文件

检索文件同样简单,可以使用 openDownloadStreamopenDownloadStreamById 方法来获取文件流。

// MongoDB Shell
const fs = new FSBucket(db, { bucketName: "myFiles" });

// 假设 'fileId' 是存储文件时返回的 ID
const readStream = fs.openDownloadStreamById(fileId);

// 读取文件流
let data = [];
readStream.on('data', chunk => data.push(chunk));
readStream.on('end', () => console.log(Buffer.concat(data)));

四、案例:存储和检索图片

假设我们有一个应用,需要存储用户上传的图片,并在需要时能够快速检索和显示这些图片。

1. 创建 GridFS Bucket
const fs = new FSBucket(db, { bucketName: "images" });
2. 存储图片
const fs = new FSBucket(db, { bucketName: "images" });

const image = fs.createWriteStream({ filename: "example.jpg" });
image.write(imageBuffer);
image.end();

这里,imageBuffer 是图片文件的 Buffer 对象。

3. 检索图片
const fs = new FSBucket(db, { bucketName: "images" });

const readStream = fs.openDownloadStreamByName("example.jpg");

// 将文件流转换为 Buffer
let data = [];
readStream.on('data', chunk => data.push(chunk));
readStream.on('end', () => {
    const imageData = Buffer.concat(data);
    // 使用 imageData 显示或处理图片
});

五、GridFS 的优势与局限

优势
  • 可扩展性:GridFS 能够处理任意大小的文件,通过将文件拆分为小块,可以轻松地扩展到大量文件和大文件的场景。
  • 可靠性:即使单个块损坏,也可以通过其他块恢复文件。
  • 元数据:GridFS 允许存储与文件相关的元数据,如文件名、MIME 类型等。
局限
  • 性能:对于小型文件,使用 GridFS 可能不如直接将文件作为二进制数据存储在文档中高效。
  • 复杂性:GridFS 的使用涉及到多个集合和文档,对于简单的文件存储需求,可能显得过于复杂。

六、结论

MongoDB 的 GridFS 提供了一种可靠、可扩展的解决方案,用于存储和检索大型文件。上面介绍了如何在 MongoDB 中使用 GridFS 存储和检索文件。在实际应用中,GridFS 可以满足多媒体应用、文档管理等场景的文件存储需求,同时确保数据的完整性和系统的可扩展性。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【MongoDB系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

MongoDB相关文章索引文章链接
MongoDB教程(一):Linux系统安装mongoDB详细教程MongoDB教程(一):Linux系统安装mongoDB详细教程
MongoDB教程(二):mongoDB引用shellMongoDB教程(二):mongoDB引用shell
MongoDB教程(三):mongoDB用户管理MongoDB教程(三):mongoDB用户管理
MongoDB教程(四):mongoDB索引MongoDB教程(四):mongoDB索引
MongoDB教程(五):mongoDB聚合框架MongoDB教程(五):mongoDB聚合框架
MongoDB教程(六):mongoDB复制副本集MongoDB教程(六):mongoDB复制副本集
MongoDB教程(七):mongoDB分片MongoDB教程(七):mongoDB分片
MongoDB教程(八):mongoDB数据备份与恢复MongoDB教程(八):mongoDB数据备份与恢复
MongoDB教程(九):java集成mongoDBMongoDB教程(九):java集成mongoDB
MongoDB教程(十):Python集成mongoDBMongoDB教程(十):Python集成mongoDB
MongoDB教程(十一):MongoDB关系管理与文档关联MongoDB教程(十一):MongoDB关系管理与文档关联
MongoDB教程(十二):MongoDB数据库索引MongoDB教程(十二):MongoDB数据库索引
MongoDB教程(十四):MongoDB查询分析MongoDB教程(十四):MongoDB查询分析
MongoDB教程(十五):MongoDB原子操作MongoDB教程(十五):MongoDB原子操作
MongoDB教程(十六):MongoDB高级索引MongoDB教程(十六):MongoDB高级索引
MongoDB教程(十七):MongoDB主键类型ObjectIdMongoDB教程(十七):MongoDB主键类型ObjectId
MongoDB教程(十八):MongoDB MapReduceMongoDB教程(十八):MongoDB MapReduce
MongoDB教程(十九):MongoDB全文检索MongoDB教程(十九):MongoDB全文检索
MongoDB教程(二十):MongoDB正则表达式MongoDB教程(二十):MongoDB正则表达式

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/870128.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows版MySQL5.7解压直用(如何卸载更换位置重新安装)

文章目录 停止mysql进程及服务迁移整个mysql文件夹删除data重启计算机重新安装 停止mysql进程及服务 net stop mysql mysqld -remove mysql迁移整个mysql文件夹 删除data 重启计算机 shutdown -r -t 0重新安装 https://blog.csdn.net/xzzteach/article/details/137723185

H3CNE(vlan的基础配置)

目录 9.1 传统以太网的问题 9.2 VLAN基础实现的原理 示例一(vlan配置的基础实现): 示例二(交换机间配置trunk): 9.3 hybrid接口类型与打标签的原理 示例三(配置hybrid接口)&#x…

【深度学习】LLaMA-Factory 大模型微调工具, 大模型GLM-4-9B Chat ,微调与部署 (2)

文章目录 数据准备chat评估模型导出模型部署总结 资料: https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md https://www.53ai.com/news/qianyanjishu/2015.html 代码拉取: git clone https://github.com/hiyouga/LLaMA-Factory.git cd …

STM32串口(串口基础)

串口整个东西可以说但凡你要碰单片机,想做点上点档次的东西的话那你就包用它的。32的串口配置并不难,哪怕是比起51其实也难不到哪去。 目录 一.通信基础 1.通信方式 2.通信速率 二.串口基础 1.串口的数据帧结构(协议) 2.ST…

【Godot4.2】GodotXML插件 - 解析和生成XML

概述 近期在研究Godot的XML和SVG解析,Godot提供了XMLParser类型,但本身只提供了低级的XML解析接口和功能,想要完成完整的XML文档解析和存储可能还需要在其基础上编写类或功能,就像我在昨天(2024年7月20日)…

Web开发:图片九宫格与非九宫格动态切换效果(HTML、CSS、JavaScript)

目录 一、业务需求 二、实现思路 三、实现过程 1、基础页面 2、图片大小调整 3、图片位置调整 4、鼠标控制切换 5、添加过渡 四、完整代码 一、业务需求 默认显示基础图片; 当鼠标移入,使用九宫格效果展示图片; 当鼠标离开&#…

基于Cobbler实现多版本系统批量部署

一、实验题目 基于Cobbler实现多版本系统批量部署 二、实验目的 通过Cobbler,实验旨在实现无需人工干预即可自动安装多个版本的操作系统。这可以大大提高机房设备或服务器集群的部署效率,减少人力成本和操作错误。 三、实验环境 centos7.9并安装Cob…

机器学习 | 回归算法原理——多重回归

Hi,大家好,我是半亩花海。接着上次的多项式回归继续更新《白话机器学习的数学》这本书的学习笔记,在此分享多重回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目,欢迎大家交流学习! 目录 一…

【Django】anaconda环境变量配置及配置python虚拟环境

文章目录 配置环境变量配置python虚拟环境查看conda源并配置国内源在虚拟环境中安装django 配置环境变量 control sysdm.cpl,,3笔者anaconda安装目录为C:\ProgramData\anaconda3 那么需要加入path中的有如下三个 C:\ProgramData\anaconda3 C:\ProgramData\anaconda3\Scripts C:…

【数据结构】搜索二叉树

二叉搜索树 二叉树的博客 在之前的数据结构的文章中已经基本对二叉树有一定的了解,二叉搜索树也是一种数据结构,下面将对二叉搜索树进行讲解。 二叉搜索树的概念 二叉搜索树又称为二叉排序树,它或者是一棵空树,或者是具有下面性…

【微软蓝屏】微软Windows蓝屏问题汇总与应对解决策略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

MongoDB教程(十八):MongoDB MapReduce

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MapRed…

上传项目到GitHub

上传项目到GitHub 前期工作&#xff1a;创建GitHub仓库 1.使用git命令初始化文件夹 git init2.将文件夹里面所有的文件添加到本地仓库&#xff0c;如果想添加单个文件&#xff0c;将.换成文件名就好。 git add .3.给文件备注&#xff0c;双引号里面是文件备注的内容 git c…

8月开始|《660》+《880》45天带刷计划!

660880题目加起来挺多了&#xff01; 如果是一刷加上二刷错题的话&#xff0c;总共需要做2000道题左右。 如果全都吃透的话&#xff0c;按照传统的刷题方法&#xff0c;慢的话需要2个多月&#xff0c;差不多就是每天30多道题的量 快的话&#xff0c;大概就是一个月就能刷完&…

低代码如何加速数字化转型

数字化转型&#xff0c;正日益决定企业成功的关键。这里的一个关键因素是它可以以更快的速度和质量来实施技术计划。在当今瞬息万变的商业环境中&#xff0c;战略性地采用低代码平台对于旨在加快上市时间、增强业务敏捷性和促进跨团队无缝协作的首席技术官来说至关重要。日益增…

【教程】vscode添加powershell7终端

win10自带的 powershell 是1.0版本的&#xff0c;太老了&#xff0c;更换为powershell7后&#xff0c;在 vscode 的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程 打开vscode终端配置 然后来到这个页面进行设置 查看 powershell7 的安装位置&#xff…

Linux开启coredump

在Linux系统中&#xff0c;C/C程序崩溃是常见的问题之一。Coredump是指当一个程序崩溃时&#xff0c;系统把程序运行时的内存数据以二进制文件的形式保存下来&#xff0c;以便程序开发者进行崩溃分析。本文将介绍如何开启并配置Coredump 1、查看并配置coredump 在Linux系统中…

Git仓库拆分和Merge

1. 问题背景 我们原先有一个项目叫open-api&#xff0c;后来想要做租户独立发展&#xff0c;每个租户独立成一个项目&#xff0c;比如租户akc独立部署一个akc-open-api&#xff0c;租户yhd独立部署一个yhd-open-api&#xff0c;其中大部分代码是相同的&#xff0c;少量租户定制…