《MongoDB GridFS最佳应用概述》

gridfs2s3:将 MongoDB GridFS 文件迁移到 AWS S3 的工具 gridfs2s3 - 将 MongoDB GridFS 文件迁移到 AWS S3 的工具 这是一个简单的工具,它将抓取您指向的 GridFS 中的所有文件,并将它们粘贴到 S3 中 安装 go install github.com/Bowbaq/gridfs2s3 用法 gridfs2s3 -h flag needs an argument: -h Usage of gridfs2s3: -b= " " : S3 bucket for the files -c= " " : Prefix of MongoDB collection to migrate. Default is to migrate everything. Use full name to migrate a single collection -d= " " : MongoDB database name 立即下载

作者:chszs,转载需注明。博客主页:http://blog.youkuaiyun.com/chszs

GridFS是MongoDB数据库之上的一个简单文件系统抽象。如果你熟悉Amazon S3的话,那么GridFS与之相似。为什么像MongoDB这样的NoSQL数据库会提供这样的一个文件层抽象呢?


一、使用GridFS的理由

理由如下:

1)存储用户产生的文件内容
大多数Web应用都允许用户上传文件。当用户使用关系数据库时,这些用户产生的文件会存储在文件系统中,与数据库相隔离,而不是放在数据库内。这就带来了一些问题。如何将文件复制到所有需要文件的服务器上?当文件删除后,怎样删除所有的拷贝?怎样保障文件的安全以及做灾备呢?GridFS很好地解决了这些问题,你可以利用你的数据库备份来备份你的文件。而且由于MongoDB自身的复制技术,在MongoDB集群中的每一个副本处都有你的文件拷贝。删除文件跟删除数据库中的对象一样简单。

2)访问文件内容的分区
当把文件上传到GridFS后,文件会被分割成大小为256KB的块,并单独存放。因此当你需要读文件中的某个范围的字节时,只需把相应的文件块载入内存,而无需把整个文件加载到内存。这一点对于选择读或编辑尺寸很大的媒体内容文件时非常有用。

3)在MongoDB中存储16MB以上的文件
MongoDB默认的文件大小上限为16MB。所以,如果你的文件超过了16MB,那么你就应该使用GridFS。

4)克服文件系统的限制
如果你需要存储大量的文件,你就需要考虑文件系统自身的限制,因为文件系统对目录下的文件数量是有要求的。而使用GridFS后,你无需再担心这个问题。GridFS和MongoDB的分片使得你的文件可以分布到多个服务器上,而且没有增加操作的复杂性。


二、深入GridFS

GridFS使用了两种集合Collection来存储数据

  1. > show collections;  
  2. fs.chunks  
  3. fs.files  
  4. system.indexes  
  5. >  
> show collections;
fs.chunks
fs.files
system.indexes
>
fs.files集合包含了文件的元数据,而fs.chunks集合则存储实际的以256KB尺寸进行分割的文件块。如果你有分片的集合,那么文件块会分布到多台服务器上,或许能获得比文件系统更好的性能。
  1. > db.fs.files.findOne();  
  2. {  
  3. "_id" : ObjectId("530cf1bf96038f5cb6df5f39"),  
  4. "filename" : "./conn.log",  
  5. "chunkSize" : 262144,  
  6. "uploadDate" : ISODate("2014-02-25T19:40:47.321Z"),  
  7. "md5" : "6515e95f8bb161f6435b130a0e587ccd",  
  8. "length" : 1644981  
  9. }  
  10. >  
> db.fs.files.findOne();
{
"_id" : ObjectId("530cf1bf96038f5cb6df5f39"),
"filename" : "./conn.log",
"chunkSize" : 262144,
"uploadDate" : ISODate("2014-02-25T19:40:47.321Z"),
"md5" : "6515e95f8bb161f6435b130a0e587ccd",
"length" : 1644981
}
>
MongoDB还在files_id和文件块数中创建了复合索引,以帮助快速访问这些文件块
  1. > db.fs.chunks.getIndexes();  
  2. [  
  3. {  
  4. "v" : 1,  
  5. "key" : {  
  6. "_id" : 1  
  7. },  
  8. "ns" : "files.fs.chunks",  
  9. "name" : "_id_"  
  10. },  
  11. {  
  12. "v" : 1,  
  13. "key" : {  
  14. "files_id" : 1,  
  15. "n" : 1  
  16. },  
  17. "ns" : "files.fs.chunks",  
  18. "name" : "files_id_1_n_1"  
  19. }  
  20. ]  
  21. >  
> db.fs.chunks.getIndexes();
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "files.fs.chunks",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"files_id" : 1,
"n" : 1
},
"ns" : "files.fs.chunks",
"name" : "files_id_1_n_1"
}
]
>

三、GridFS实例

MongoDB有一个内建的工具mongofiles,可以帮助练习实际使用GridFS的场景。请参阅相关的Driver文档,查看如何使用GridFS。

  1. Put  
  2. #mongofiles -h  -u  -p  --db files put /conn.log   
  3. connected to: 127.0.0.1  
  4. added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 }  
  5. done!  
  6.   
  7. Get  
  8. #mongofiles -h  -u  -p  --db files get /conn.log   
  9. connected to: 127.0.0.1  
  10. done write to: ./conn.log  
  11.   
  12. List  
  13. # mongofiles -h  -u  -p  list   
  14. connected to: 127.0.0.1  
  15. /conn.log 1644981  
  16.   
  17. Delete  
  18. [root@ip-10-198-25-43 tmp]# mongofiles -h  -u  -p  --db files delete /conn.log  
  19. connected to: 127.0.0.1  
  20. done!  
Put
#mongofiles -h  -u  -p  --db files put /conn.log
connected to: 127.0.0.1
added file: { _id: ObjectId('530cf1009710ca8fd47d7d5d'), filename: "./conn.log", chunkSize: 262144, uploadDate: new Date(1393357057021), md5: "6515e95f8bb161f6435b130a0e587ccd", length: 1644981 }
done!

Get
#mongofiles -h  -u  -p  --db files get /conn.log
connected to: 127.0.0.1
done write to: ./conn.log

List
# mongofiles -h  -u  -p  list
connected to: 127.0.0.1
/conn.log 1644981

Delete
[root@ip-10-198-25-43 tmp]# mongofiles -h  -u  -p  --db files delete /conn.log
connected to: 127.0.0.1
done!

四、GridFS的模块

如果你想把存储在MongoDB的GridFS的文件直接服务于Web服务器或文件系统,那么你可以使用下面的GridFS插件:
1)GridFS-Fuse:让GridFS的文件直接服务于文件系统
2)GridFS-Nginx:让GridFS的文件直接服务于Nginx


五、GridFS的局限性

GridFS也并非十全十美的,它也有一些局限性:
1)工作集
伴随数据库内容的GridFS文件会显著地搅动MongoDB的内存工作集。如果你不想让GridFS的文件影响到你的内存工作集,那么可以把GridFS的文件存储到不同的MongoDB服务器上。
2)性能
文件服务性能会慢于从Web服务器或文件系统中提供本地文件服务的性能。但是这个性能的损失换来的是管理上的优势。
3)原子更新
GridFS没有提供对文件的原子更新方式。如果你需要满足这种需求,那么你需要维护文件的多个版本,并选择正确的版本。

ROS 2 Slam Toolbox实战:从零跑通2D激光建图 SLAM(同步定位与地图构建)是移动机器人实现自主导航的基础技术,其核心在于通过传感器数据实时估计位姿并构建环境栅格地图。slam_toolbox作为ROS 2 Humble及后续LTS版本官方主推的2D SLAM后端,采用图优化+闭环检测架构,兼顾实时性、鲁棒性与工程可维护性。相比cartographer和hector_slam,它原生支持ROS 2、参数精简、诊断友好,特别适合硬件资源有限、缺乏IMU或深度相机的差速机器人平台。本文聚焦真实部署场景,覆盖RPLIDAR等常见2D激光雷达与TurtleBo 阅读详情

相关推荐

【硬件工程师职业细分】揭秘硬件基带工程师

你知道硬件工程师的细分领域硬件基带工程师吗? 它们和常见的硬件工程师又有哪些不同? 福利待遇怎么样?有哪些职业要求? 快来涨上一波知识吧~

woshizzai的博客 1万+

MongoDB GridFS最佳应用概述

《MongoDB GridFS的最佳应用概述》作者:chszs,转载需注明。博客主页:http://blog.youkuaiyun.com/chszsGridFS是MongoDB数据库之上的一个简单文件系统抽象。如果你熟悉Amazon S3的话,那么GridFS与之相似。为什么像MongoDB这样的NoSQL数据库会提供这样的一个文件层抽象呢?一、使用GridFS的理由理由如下:1)存储用户产生的文件内容大多

chszs的专栏 1万+

基于MCP协议的AssistAI:深度集成Eclipse的AI编程助手实战指南

在AI辅助编程领域,大型语言模型(LLM)与开发工具的深度集成是提升开发效率的关键。其核心原理在于通过标准化的协议(如MCP,Model Context Protocol),将IDE的功能封装为AI可调用的工具集,从而实现环境感知与操作同步。这项技术的价值在于打破了传统AI编程工具与开发者工作流的割裂,使AI能够以符合工程规范的方式直接操作项目,如进行代码重构、运行测试和交互式调试。其典型应用场景包括复杂代码导航、自动化测试生成与精准的增量编译。本文以Eclipse插件AssistAI为例,详细解析了如何通

weixin_42531579的博客 559

java gridfs_什么情况下应该使用GridFS(翻译)

对于MongoDB collection下的文档而言,在文件大于16MB时,我们应该使用GridFS。在一些解决方案中,使用MongoDB的GridFS存储大文件,比使用系统级别的文件系统更便利。.当文件系统的目录对文件数量有限制时,你应该使用GridFS来存储需要的尽可能多的文件;.当你想让你的文件和元数据在多个系统和设施之间自动同步和部署时。使用地理上分布的副本集(geographically...

weixin_42355215的博客 333

告别MATLAB依赖:手把手教你用Python实现GCC-PHAT时延估计(附完整代码与对比测试)

本文详细介绍了如何使用Python实现GCC-PHAT时延估计算法,替代传统的MATLAB依赖。通过完整的代码示例和性能对比测试,展示了Python在信号处理领域的强大能力,特别是在广义互相关和TDOA应用中的高效实现。文章还提供了实时音频处理和嵌入式部署的实用技巧,帮助工程师快速掌握这一关键技术。

weixin_42667269的博客 221

《Long-CLIP: Unlocking the Long-Text Capability of CLIP》

总的来说,Long-CLIP是一个改进的视觉-语言预训练模型,它通过知识保留的位置上插值和主要成分匹配策略,有效解决了原始CLIP模型在处理长文本输入时的限制。这一模型不仅在长文本图像检索任务中表现出色,而且在零样本图像分类任务中保持了与原始CLIP相当的性能,同时还能以即插即用的方式增强图像生成任务中的长文本处理能力。

Angelina_Jolie的博客 1379

GridFS(MongoDB文件系统)与OCS对象存储的取舍

GridFS是MongoDB提供的一种存储和检索大型文件(如图片、音频文件、视频文件等)的机制。由于MongoDB的文档大小限制为16MB,对于大文件来说,无法将它们直接存储为一个单一的文档。GridFS通过将大文件分割成多个较小的部分(chunks),并将它们存储在多个文档中来绕过这个限制。GridFS实际上是一种规范,包含了两个主要的集合:chunks 集合:用于存储文件的二进制数据的分块,每个分块(chunk)的默认大小是255KB(可以配置)。整个文件被分成这样多个大小的分块,并顺序存储。

weixin_54622246的博客 1866

2026年迈瑞医疗嵌入式岗位面试题集(含参考答案)

文章摘要 本文总结了嵌入式开发面试中的30道题目,涵盖7大模块:嵌入式硬件与底层驱动、C/C++语言基础、操作系统与多线程编程、网络通信协议、数据结构与算法、开发工具与调试能力、综合素养与职业认知。重点解析了I²C通信协议的工作原理、速率选择及异常排查方法;USB的报文协议与四种传输类型及其适用场景;硬中断与软中断的区别及设计注意事项;字节序的概念与处理方法;以及C++中static和const关键字的核心作用。内容深入实用,适用于嵌入式开发者的技术提升与面试准备。

Open 53

基于MongoDb的S3实现

【原文】http://www.fuchaoqun.com/2010/05/s3-on-mongodb-with-php/原理是利用MongoDb的GridFS,伸展性方面交由MongoDb的auto sharding去实现,这里用PHP给MongoDb绑了个S3出来,支持选择文件存储节点,支持文件分目录存储,这样的好处是对于一些受时间影响比较明显的文件,...

weixin_34191845的博客 323

无线传感网络的Matlab实现

Matlab是一种功能强大的数值计算和数据分析工具,也可以用于无线传感网络的建模和仿真。根据实际需求,可以进一步扩展和优化模型,例如考虑节点能量消耗、网络路由、数据融合等方面的问题。函数用于绘制节点之间的连接关系,其中第一个参数是邻接矩阵,描述了节点之间的连接关系。这里使用了一个4个节点的简单例子,可以根据实际需求修改节点数量和连接关系。可以使用Matlab中的图形绘制函数来可视化节点的位置和连接关系。在无线传感网络中,节点的能量是一个关键因素。通过计算节点的剩余能量,可以评估节点的能量消耗情况。

2301_79331387的博客 249

nginx-gridfs终极指南:从MongoDB GridFS直接提供文件的高性能Nginx模块

**nginx-gridfs**是一个强大的Nginx模块,能够直接从MongoDB的GridFS存储系统提供文件服务,为开发者和系统管理员提供了一种高效、灵活的文件存储与分发解决方案。通过将Nginx的高性能与MongoDB的分布式存储能力相结合,该模块实现了文件的快速访问与可靠管理,是构建现代Web应用的理想选择。 ## 🚀 什么是nginx-gridfs? nginx-gridfs是一

gitblog_00232的博客 926

基于MATLAB Simulink的电动汽车整车控制仿真

在本文中,我们选择了power_ElectricVehicle示例模型,该模型已经包含了电动汽车的基本组成部分,包括电机、变速器、驱动轮、电池等。例如,使用PID控制器来控制电机的转速,使用ABS控制器来控制车轮的制动力,使用转向控制器来控制车辆的转向角度,使用悬挂控制器来控制车轮的姿态等。通过建立模型和实现控制器,我们可以比较直观地了解电动汽车的工作原理和性能特点,并验证设计的控制系统在不同工况下的效果。而在电动汽车的开发中,整车控制系统是至关重要的一个组成部分,直接影响着电动汽车的性能和性价比。

qq_39605374的博客 1802

nginx-gridfs核心功能解析:为什么它是MongoDB文件存储的最佳搭档?

在现代Web应用开发中,文件存储和管理是一个永恒的话题。📁 当你的应用需要处理大量文件,比如用户上传的图片、视频、文档时,传统的文件系统存储方式往往会遇到扩展性、备份和分布式部署的挑战。这时,MongoDB的GridFS文件存储系统就成为了一个强大的解决方案,而**nginx-gridfs**模块正是连接Nginx与GridFS的完美桥梁! **nginx-gridfs**是一个专门为Ngin

gitblog_00271的博客 472

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

MongoDB的GridFS是什么,它是如何工作的?

MongoDB 的 GridFS 是一种用于存储和检索超过 16MB(这是 MongoDB 文档大小的限制)的大文件的规范。它将大文件分割成多个小块(默认每个块为255KB),然后将这些块作为单独的文档存储在数据库中。GridFS 使用两个集合来实现这一点:一个用于存储文件的二进制数据,另一个用于存储文件的元数据。

qq_33240556的博客 708

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MongoDB GridFS 大文件存储实战:分块原理、断点续传与避坑指南

在数据存储领域,处理超大文件常常需要引入分布式文件系统或对象存储,但这也意味着额外的运维成本与架构复杂度。当系统已基于 MongoDB 运行时,其内置的 GridFS 协议提供了一种轻量级的大文件存储方案。GridFS 通过将文件拆分为多个块(chunk),突破单文档 16MB 的限制,并利用 fs.files 与 fs.chunks 两个集合实现元数据与二进制数据的分离管理,其分块机制天然支持断点续传与流式读写,适合数据归档、视频存储及日志备份等场景。理解其核心原理与适用边界,能帮助后端工程师在资源受限或

weixin_34297704的博客 396

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MongoDB Shell指南–操作和命令

本文是我们学院课程中名为MongoDB –可扩展NoSQL DB的一部分 。 在本课程中,您将被介绍到MongoDB。 您将学习如何安装它以及如何通过它的外壳进行操作。 此外,您还将学习如何通过Java以编程方式访问它以及如何将Map Reduce与其一起使用。 最后,将解释更高级的概念,例如分片和复制。 在这里查看 ! 目录 1.简介 2. Shell命令助手 3...

danpu0978的博客 963

mongodb入门级权威指南

1、 NoSQL简介 1.1 什么是NoSQL? NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。 1.2 为什么使用NoSQL ? 今天我们...

qqxhb 资源共享 849

MongoDB管理工具终极对比:为什么mongo-express是最佳Web界面选择

在当今数据驱动的时代,MongoDB作为最流行的NoSQL数据库之一,被广泛应用于各种规模的项目中。然而,对于开发者和数据库管理员来说,如何高效地管理MongoDB数据库一直是个挑战。mongo-express作为一款基于Web的MongoDB管理工具,为开发者提供了直观、便捷的数据库管理体验。😊 ## 什么是mongo-express? mongo-express是一个使用Node.js、

gitblog_00132的博客 379

mongodb文档太大_在MongoDB中存储非常大的文档

简而言之:如果您有大量不同大小的文档,那么相对较少的文档达到最大对象大小,那么在MongoDB中存储这些文档的最佳做法是什么?我有一些文件,如:{_id: ...,values: [12, 13, 434, 5555 ...]}值列表的长度从一个文档到另一个文件大不相同.对于大多数文档,它将具有几个元素,一些将有数千万个元素,我将在MongoDB中达到最大对象大小限制.麻烦的是我提出的任何特殊的解...

weixin_31899235的博客 445
上一篇: 基于MongoDB GridFS的图片存储
下一篇: Memcached 及 Redis 架构分析和比较
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值