MongoDB之GridFS

article/2025/10/14 13:58:42
【MongoDB是什么?】
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

(注:以上内容选自百度百科)


其实Mongodb中有一个重要功能--GridFS,但并不为人所熟悉。本文主要讲解如何更好地使用GridFS功能,结合实践中的案例分享经验。


【Mongobd的重要模块--GridFS

GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件,对于MongoDB的BSON格式的数据(文档)存储有尺寸限制,最大为16M。但是在实际系统开发中,上传的图片或者文件可能尺寸会很大,此时我们可以借用GridFS来辅助管理这些文件。


GridFS不是MongoDB自身特性,只是一种将大型文件存储在MongoDB的文件规范,所有官方支持的驱动均实现了GridFS规范。GridFS制定大文件在数据库中如何处理,通过开发语言驱动来完成、通过API接口来存储检索大文件。


<使用场景>

▲如果您的文件系统在一个目录中存储的文件的数量有限,你可以使用GridFS存储尽可能多的文件。

当你想访问大型文件的部分信息,却不想加载整个文件到内存时,您可以使用GridFS存储文件,并读取文件部分信息,而不需要加载整个文件到内存。

当你想让你的文件和元数据自动同步并部署在多个系统和设施,你可以使用GridFS实现分布式文件存储。


【GridFS存储原理】

GridFS使用两个集合(collection)存储文件。一个集合是chunks, 用于存储文件内容的二进制数据;一个集合是files,用于存储文件的元数据。


GridFS会将两个集合放在一个普通的buket中,并且这两个集合使用buket的名字作为前缀。MongoDB的GridFs默认使用fs命名的buket存放两个文件集合。因此存储文件的两个集合分别会命名为集合fs.files ,集合fs.chunks。


当然也可以定义不同的buket名字,甚至在一个数据库中定义多个bukets,但所有的集合的名字都不得超过mongoDB命名空间的限制。


MongoDB集合的命名包括了数据库名字与集合名字,会将数据库名与集合名通过“.”分隔(eg:<database>.<collection>)。而且命名的最大长度不得超过120bytes。


当把一个文件存储到GridFS时,如果文件大于chunksize (每个chunk块大小为256KB),会先将文件按照chunk的大小分割成多个chunk块,最终将chunk块的信息存储在fs.chunks集合的多个文档中。然后将文件信息存储在fs.files集合的唯一一份文档中。其中fs.chunks集合中多个文档中的file_id字段对应fs.files集中文档”_id”字段。


读文件时,先根据查询条件在files集合中找到对应的文档,同时得到“_id”字段,再根据“_id”在chunks集合中查询所有“files_id”等于“_id”的文档。最后根据“n”字段顺序读取chunk的“data”字段数据,还原文件。


存储过程如图下所示:

fs.files 集合存储文件的元数据,以类json格式文档形式存储。每在GridFS存储一个文件,则会在fs.files集合中对应生成一个文档。
▲fs.files集合中文档的存储内容如下:


fs.chunks 集合存储文件文件内容的二进制数据,以类json格式文档形式存储。每在GridFS存储一个文件,GridFS就会将文件内容按照chunksize大小(chunk容量为256k)分成多个文件块,然后将文件块按照类json格式存在.chunks集合中,每个文件块对应fs.chunk集合中一个文档。一个存储文件会对应一到多个chunk文档。
▲ fs.chunks集合中文档的存储内容如下:

为了提高检索速度 MongoDB为GridFS的两个集合建立了索引。fs.files集合使用是“filename”与“uploadDate” 字段作为唯一、复合索引。fs.chunk集合使用的是“files_id”与“n”字段作为唯一、复合索引。


【如何使用GridFS?】
<使用shell命令>
mongoDB提供mingofiles工具,可以使用命令行来操作GridFS。其实有四个主要命令,分别为:
put —存储命令
get —获取命令 
list —列表命令
delete —删除命令
这些命令都是按照filename操作GridFS中存储的文件的。



<使用API>
MongoDB支持多种编程语言驱动。比如c、java、C#、nodeJs等。因此可以使用这些语言MongoDB驱动API操作,扩展GridFS。


【经验分享】

GridFs不会自动处理md5值相同的文件,也就是说,同一个文件进行两次put命令,将会在GridFS中对应两个不同的存储,对于存储来说,这是一种浪费。对于md5相同的文件,如果想要在GridFS中只有一个存储,需要通过API进行扩展处理。


MongoDB 不会释放已经占用的硬盘空间。即使删除db中的集合 MongoDB也不会释放磁盘空间。同样,如果使用GridFS存储文件,从GridFS存储中删除无用的垃圾文件,MongoDB依然不会释放磁盘空间的。这会造成磁盘一直在消耗,而无法回收利用的问题。


那么怎样才能释放磁盘空间呢?

(1)可以通过修复数据库来回收磁盘空间,即在mongo shell中运行db.repairDatabase()命令或者db.runCommand({ repairDatabase: 1 })命令。(此命令执行比较慢)。

使用通过修复数据库方法回收磁盘时需要注意,待修复磁盘的剩余空间必须大于等于存储数据集占用空间加上2G,否则无法完成修复。因此使用GridFS大量存储文件必须提前考虑设计磁盘回收方案,以解决mongoDB磁盘回收问题。


(2)使用dump & restore方式,即先删除mongoDB数据库中需要清除的数据,然后使用mongodump备份数据库。备份完成后,删除MongoDB的数据库,使用Mongorestore工具恢复备份数据到数据库。


当使用db.repairDatabase()命令没有足够的磁盘剩余空间时,可以采用dump & restore方式回收磁盘资源。如果MongoDB是副本集模式,dump & restore方式可以做到对外持续服务,在不影响MongoDB正常使用下回收磁盘资源。


MogonDB使用副本集, 实践使用dump & restore方式,回收磁盘资源。70G的数据在2小时之内完成数据清理及磁盘回收,并且整个过程不影响MongoDB对外服务,同时可以保证处理过程中数据库增量数据的完整。

文章来自 http://rdc.hundsun.com/portal/article/703.html


http://chatgpt.dhexx.cn/article/mvY7Go7X.shtml

相关文章

Python操作mongo--GridFS

业务场景&#xff1a; 通过python查询mongo数据库中所存储的图片 条件&#xff1a; 查询上传日期大于等于2022-03-04的图片并保存到本地 度娘了好多文章&#xff0c;发现除了疯狂的套娃有用的信息很少&#xff0c;于是有了此文章&#xff0c;&#xff0c;理解不了的可以结合截…

Mongodb操作GridFS案例

文章目录 准备环境Navicat中查看GridFS存储桶登录连接查看 准备环境 开启服务 mongod -f /opt/servers/mongodb_demo/mongodb/conf/mongod.conf 关闭防火墙 systemctl stop firewalld.service 查看防火墙的状态 systemctl status firewalld.service 进入mongo shell mongo …

MongoDB中的GridFs是什么

本文来介绍下MongoDB的GridFsTemplate如何使用 文章目录 什么是GridFS为什么要使用GridFSGridFS的两个集合本文小结 什么是GridFS GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。GridFS是MongoDB中的一个内置功能&#xff0c;可以用…

GridFS文件存储

GridFS文件存储 使用命令行操作GridFS 提前创建好文件 1.上传文件 现在我们使用 GridFS 的 put 命令来存储 GridFS存储.ppt文件。 调用 MongoDB 安装目录下bin的mongofiles.exe工具。 打开命令提示符&#xff0c;进入到MongoDB的安装目录的bin目录中&#xff0c;找到mongof…

GridFs的初步了解

前言 刚刚接触到了MongoDB的分布式文件存储系统GridFs&#xff0c;以前没了解过&#xff0c;这里记录一下它的简单使用。 1、GridFs介绍 GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。 GridFS 用于存储和恢复那些超过16M&#x…

2023 mongodb GridFS整合SpringBoot

接了个&#xff0c;为了节约成本以及提高开发效率&#xff0c;文件存储和数据存储都用的是mongodb&#xff0c;网上找了一大堆gridfs的案例&#xff0c;发现都不好用&#xff0c;嗯&#xff0c;&#xff0c;&#xff0c;自己动手写吧&#xff0c;仅供参考。 核心pom配置 ser…

GridFS文件操作

1. GridFS介绍 GridFS是MongoDB提供的用于持久化存储文件的模块&#xff0c;CMS使用MongoDB存储数据&#xff0c;使用GridFS可以快速集成 开发。 它的工作原理是&#xff1a; 在GridFS存储文件是将文件分块存储&#xff0c;文件会按照256KB的大小分割成多个块进行存储&#xf…

MongoDB GridFS

GridFS简介 GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件。并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案&#xff0c;通常用来处理大文件&#xff0c;对于MongoDB的BSON格式的数据(文档)存储有尺寸限制&a…

GridFS详细分析

GridFS简介 GridFS是MongoDB中的一个内置功能&#xff0c;可以用于存放大量小文件。 http://www.mongodb.org/display/DOCS/GridFS http://www.mongodb.org/display/DOCS/GridFSSpecification GridFS使用 MongoDB提供了一个命令行工具mongofiles可以来处理GridFS&#xff…

13.MongoDB之Gridfs

参照官网如下(如下链接依次递进)&#xff1a; https://docs.mongodb.com/manual/core/gridfs/ https://docs.mongodb.com/database-tools/mongofiles/#mongodb-binary-bin.mongofiles https://docs.mongodb.com/database-tools/installation/installation/ FS&#xff1a;即文…

MongoDB(四)——GridFS

GridFS MongoDB的一个重要子模块&#xff0c;可基于MongoDB来持久存储文件&#xff0c;并且支持分布式存储和读取。 持久存储&#xff1a;对应瞬时数据如内存&#xff0c;指保存到数据库中&#xff0c;能持久保存。 分布式存储&#xff1a;将数据分散地存储于多个位置。 存在的…

在Keil MDK中无法使用gmtime函数进行时间戳转换

硬件平台STM32&#xff0c;软件平台Keil MDK 5.18 由于项目中需要用到UNIX时间戳和日历的来回转换&#xff0c;于是想到C库函数<time.h>里面有现成的函数可以使用。 于直接使用mktime和gmtime两个函数进行时间戳转换&#xff0c;前者把日历转为时间戳&#xff0c;后者把…

C++中获取日期函数gmtime和localtime区别

函数gmtime和localtime的声明如下&#xff1a; struct tm * gmtime (const time_t * timer); struct tm * localtime (const time_t * timer); 它们均接收一个time_t的const指针类型&#xff0c;time_t类型通常是一个大整数值&#xff0c;该整数值表示自UTC时间1970年1月1日0…

C语言学习笔记---时间函数ctime()和gmtime()

函数原型如下&#xff1a; __CRT_INLINE char *__cdecl ctime(const time_t *_Time);__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time);ctime函数 ctime函数可以将当前时间值转换为字符串格式返回。返回的字符串格式为&#xff1a;Www Mmm dd hh:mm:ss yyyy 其中&…

Linux系统编程一:时间和延时、gmtime和localtime函数返回相同

目录 1. 概述2. 延时函数3. 当前时间3.1 时间调用函数3.2 时间转换函数 4. gmtime和localtime函数返回相同测试代码 1. 概述 前面的几篇文章Linux学习笔记一到七&#xff0c;主要是开发环境的搭建&#xff0c;都是一些准备工作。从本篇文章开始&#xff0c;将学习Linux系统编程…

逆向 time.h 函数库 time、gmtime 函数

0x01 time 函数 函数原型&#xff1a;time_t time(time_t *t)函数功能&#xff1a;返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间&#xff0c;以秒为单位。如果 seconds 不为空&#xff0c;则返回值也存储在变量 seconds 中C\C 实现&#xff1a; #include <stdio.…

python gmtime_在Python中操作日期和时间之gmtime()方法的使用

在Python中操作日期和时间之gmtime()方法的使用 这篇文章主要介绍了在Python中操作日期和时间之gmtime()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 gmtime()方法转换历元到一struct_time以UTC其中dst的标志值始终为0以秒表示时间。如果不设置秒时或None&a…

gmtime与localtime的区别

目录 gmtime函数 linux环境下&#xff1a; window环境下 localtime函数 gmtime函数 gmtime转换的时间是UTL时间&#xff0c;与北京时间相差了8个小时 如果你想要得到北京时间&#xff0c;不建议你将gmtime转换后的时间直接加上八个小时 linux环境下&#xff1a; 执行结…

【C库函数】strerror函数详解

目录 strerror 函数原型 参数详解 返回值详解 函数讲解 strerror 返回错误码&#xff0c;所对应的错误信息 函数原型 char *strerror( int errnum ); 参数详解 参数errnum解析错误码信息(errno) 返回值详解 strerror函数就是返回这些错误码所对应错误信息的字符串起始地…

详解:strerror函数:将错误码转化为错误信息

对于大家在浏览网页的时候&#xff0c;或多或少的会见识过不少的错误信息&#xff1a;比如&#xff1a;最常见的就是&#xff1a;404 但是&#xff0c;使用strerror函数&#xff0c;可以将错误码转化为错误信息&#xff01;不知道偶然间看见的读者是否有兴趣进行深入研究一下&…