MongoDB——GridFS
GridFS是一个规范的存储和检索文件超过16 mb的bson文档大小限制。
而不是将文件存储在一个文档中,GridFS文件分为部分,或块,每个块作为一个单独的文档。使用FridFS与使用分片无
关。在默认情况下网格文件系统块大小限制为255 k。GridFS文件系统使用两个集合存储文件。一个收集存储文件块,
其他商店文件元数据。
当你查询GridFS文件系统存储文件时,驱动或客户端将重新组装块。你可以通过GridFS文件系统上执行范围查询
文件存储。你也可以从任意部分的文件访问信息,你可以“跳过”的视频或音频文件。
网格文件系统不仅是有用的用于存储超过16 mb的文件,还用于存储任何文件,您想要访问而不需要整个文件加载到内
存中。
什么情况下使用?
在MongoDB文档集合,你应该总是使用GridFS存储文件大于16 MB。在某些情况下,在MongoDB数据库比系统级文件
系统存储大文件可能更有效。
(1)如果你的文件系统限制一个目录中的文件的数量,你可以根据需要使用GridFS文件系统存储尽可能多的文件。(2)当你想让你的文件和元数据自动同步和部署多个系统和设施。当使用分布式副本集MongoDB可以分发文件和
元数据自动生成mongod实例和设施。
(3)当您想要访问的信息来自部分大文件,而无需全部文件加载到内存中,您可以使用GridFS召回部分文件不用
读取整个文件到内存中。
如果需要自动更新整个文件的内容,不要使用GridFS。作为替代,你可以将每个文件存储多个版本,每个文件并指定元数据文件的当前版本。当上传新版本的文件之后,您可以更新元数据字段,在原子钟标明最新状态。之后删除以前的版本。
实现GridFS
使用GridFS文件系统来存储和检索文件:
(1)引入驱动(2)mongofiles mongo shell命令行工具。参考文档 点击打开链接
GridFS集合
GridFS将文件存储在两个集合:
块集合——存储二进制数据块。
块中的每个文档集合代表一个单独的块GridFS文件。下面是一个原型文档块集合。
{ "_id" : <ObjectId>, "files_id" : <ObjectId>, "n" : <num>, "data" : <binary> }
该块集合包含以下字段:
chunks._id 独特的ObjectId块。
chunks.files_id 父类文档事务id
chunks.n 块的序列号。GridFS文件系统数据块,从0开始。
chunks.data 块的有效载荷BSON二进制类型。
块使用复合索引文件集合id和n
文件——存储文件的元数据。
每个文档的文件集合表示GridFS文件系统中的一个文件存储。考虑下面的原型文档的文件集合:
{ "_id" : <ObjectId>, "length" : <num>, "chunkSize" : <num>, "uploadDate" : <timestamp>, "md5" : <hash>, "filename" : <string>, "contentType" : <string>, "aliases" : <string array>, "metadata" : <dataObject>, }
文档的文件集合包含以下字段的部分或全部。应用程序可以创建额外的任意字段:
files._id 本文档的惟一ID。id是为原始文档选择的数据类型。BSON ObjectId MongoDB文档的默认类型。
files.length 文件的大小(以字节为单位)。
files.chunkSize 每个块的大小。GridFS文件系统将文档划分为指定的块大小。默认大小是255字节。2.4.10版
本的变化:默认从256 k到256 k块大小改变。
files.uploadDate 文档第一次由GridFS存储的日期。这个值的日期类型。
files.md5 MD5散列filemd5返回的命令。这个值是字符串类型。
files.filename 可选的。一个可读的文档的名称。
files.contentType 可选的。一个合法的文档的MIME类型。
files.aliases 可选的。一个别名字符串数组。
files.metadata 可选的。想要存储任何额外的信息。
GridFS索引
GridFS文件系统使用一个独特的、复合索引文件的块集合id和n字段。id字段包含的id的文件块的“父”文档。n
字段包含块的序列号。网格文件系统数据块,从0开始。
GridFS文件系统索引允许使用的文件块的有效检索id和n值,如以下示例所示:
cursor = db.fs.chunks.find({files_id: myFileID}).sort({n:1});
如果你的驱动没有创建这个索引,使用mongo shell执行以下操作:
db.fs.chunks.ensureIndex( { files_id: 1, n: 1 }, { unique: true } );
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。