1、MongoDB GridFS 1.1、GridFS概述随着web 3.0的兴起,数据的形式不局限于文字,还有语音、视频、图片等。高效存储与检索二进制数据也成为web 3.0必须要考虑的问题。然而这种二进制数据是不适合存储在普通关系型数据库(MySQL、Oracle)中的,关系型数据库更多的是存储图片的访问路径。因此二进制数据可以使用MongoDB的内置模块GridFS进行检索与存储,也是一种比较好的解决方案。
Grid中文释义为网格,FS(File System)释义为文件系统,合起来就是网格式的文件存储规范或系统。GridFS是MongoDB的一个子模块,用于存储和检索超过16M(BSON)的文件,如果文件大小没有超过16M可以将数据保存常规的BSON中。
在实际系统开发中,上传的图片或者文件可能尺寸会很大,此时我们可以借用 GridFS 来辅助管理这些文件。注意:GridFS不是MongoDB自身特性,只是一种将大型文件存储在 MongoDB 的文件规范。这种规范也不是将一个大文件存储在一条文档中,而是自动将文件分成块,每一块作为一条文档单独存储(GridFS使用的块容量默认是256k)。
1.2、GridFS存储原理GridFS使用两个集合(collection)存储文件:
- chunks:用于存储文件内容的二进制数据
- files:用于存储文件的元数据(meta数据包括filename、content_type、用户自定义属性等)
GridFS会将两个集合放在一个普通的buket中,并且这两个集合使用buket的名字作为前缀。MongoDB的GridFS默认使用fs命名的buket存放两个文件集合。因此存储文件的两个集合分别会命名为集合fs.files和集合fs.chunks。
当然也可以自定义不同的buket名字,可以在一个数据库中定义多个bukets,但所有的集合的名字都不得超过MongoDB命名空间的限制(MongoDB 集合的命名包括了数据库名字与集合名字,会将数据库名与集合名通过"."分隔。而且命名的最大长度不得超过120bytes)。
使用GridFS存储文件时,如果文件大于 256K ,会先将文件分割成多个块,最终将 chunk 块的信息存储在fs.chunks集合的多个文档中。然后将文件信息存储在fs.files集合的唯一一份文档中。对于同一个大文件,fs.chunks集合中多个文档中的file_id字段对应fs.files集中某一个文档的_id字段。
除此之外files集合中的文档就是BSON格式存储的,可以使用MongoDB的索引的一系列特性,因此可以更快的遍历与操作文件。
1.3、GridFS应用场景1、应用系统有需要上传图片(用户上传或者系统本身的文件发布等)
2、文件分布式存储与读取(与其他分布式文件存储系统没啥区别)
3、文件的量级处于飞速增长,有可能达到操作系统自己的文件系统的查询性能瓶颈(甚至超过系统硬盘的扩容范围)
4、文件的备份(不使用GridFS这种方式也可以做,但是更加方面)
5、文件系统访问的故障转移和修复(GridFS可以避免用于存储用户上传内容的文件系统出现的某些问题)
6、文件检索支持索引检索,存储除文件本身以外还需要关联更多的元数据信息(文件的发布式作者、发布时间、文件tag属性等等自定义信息),有了索引后可以更快的检索出文件元数据和文件本身。
7、对文件的分类模糊(文件夹分类关系混乱或者无法分类)
8、文件尺寸较小,而且众多,且文件经常有可能被迁移、删除、修改元数据等
2、文件上传、下载、预览功能实现 2.1、在SpringBoot中集成MongoDB具体集成细节就不重复说了,请参照这篇文章:
文章地址:https://blog.csdn.net/m0_46357847/article/details/123803461
2.2、文件上传功能 END


