MySQL数据库工程师入门实战课程视频教程
4950 人在学
mongodb除了保存各种文档(JOSN结构)外还能够保存文件。MongoDB的文档以BSON格式存储,支持二进制数据类型,所以,可以把文件的二进制格式的数据直接保存到MongoDB的文档中,但是每个文档的长度是有限制的,而我们一般上传的图片、视频等文件又比较大。针对这种情况,mongoDB提供了一种处理大文件的规范——GridFS。GridFS规范提供了一种透明机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。
一、实现原理:
将要存储的文件分成若干块儿,每一块作为一个单独的文档来存储,每块默认大小为256k。用两个集合来存储一个文件:fs.files与fs.chunks。
fs.files存放文件信息
文件的元数据放在这个集合里面,默认fs.files。这个里面的每个文档表示GridFS中的一个文件,与文件相关的自定义元数据也保存在其中,除了用户自定义的键,GridFS还有默认的一些键:
1._id:唯一标识
2.length:文件总长度
3.chunksize:没块儿的大小,默认为256k
4.uploadDate:时间戳
5.md5:文件内容的md5校验和,值由服务器端生成,用于计算上传块的md5校验和,用户可以校验md5的值确保文件正确上传。contentType:文件类型还可以添加其他键来标识这个文件,例如,可以是上传者的信息。
fs.chunks:存放文件的数据
GridFS的块有个单独的集合。默认情况下,块将使用fs.chunks集合,如果有需要可以覆盖。这个块集合里面文档的结构非常简单:
1._id:标志唯一
2.n:表示块的编号,也就是这个块在原文件中的顺序号
3.data:包含组成文件块的二进制数据
4.files_id:包含这个块元数据的文件文档的"_id"
二、保存文件的流程:
如果文件大于chunksize,则把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。
三、读取文件的流程:
先据查询的条件,在fs.files中找到对应的文档,得到“_id”的值,再据这个值到fs.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。
四、什么情况下使用?
在MongoDB文档集合,你应该总是使用GridFS存储文件大于16MB。在某些情况下,在MongoDB数据库比系统级文件系统存储大文件可能更有效。
(1)如果你的文件系统限制一个目录中的文件的数量,你可以根据需要使用GridFS文件系统存储尽可能多的文件。
(2)当你想让你的文件和元数据自动同步和部署多个系统和设施。当使用分布式副本集MongoDB可以分发文件和元数据自动生成mongod实例和设施。
(3)当您想要访问的信息来自部分大文件,而无需全部文件加载到内存中,您可以使用GridFS召回部分文件不用读取整个文件到内存中。
如果需要自动更新整个文件的内容,不要使用GridFS。作为替代,你可以将每个文件存储多个版本,每个文件并指定元数据文件的当前版本。
当上传新版本的文件之后,您可以更新元数据字段,在原子钟标明最新状态。之后删除以前的版本。
五、注意:
GridFS在上传文件过程中是先把文件数据保存到fs.chunks,最后再把文件信息保存到fs.files中,所以如果在上传文件过程中失败,有可能在fs.chunks中出现垃圾数据。这些垃圾数据可以定期清理掉。
小编结语:
更多内容尽在课课家教育!