MongoDB——GridFS

来源:互联网 发布:golang教程 csdn 编辑:程序博客网 时间:2024/06/07 02:18

上篇文章提到MongoDB内置GridFS,支持海量存储。那么GridFS具体是如何存储的呢?有何特殊之处呢?

在实际系统开发中,经常会有上传图片或文件的功能,这些文件可能尺寸很大。。我们可以借用GridFS来辅助管理。

GridFS结构:

这里写图片描述

MongoDBGridFS由表名.files和表名.chunks构成,前者存文件信息,后者存文件的内容,两者再通过_id与files_id建立关联。

.files:
这里写图片描述
.chunks:
这里写图片描述
一个fs.files集合中的一条记录内容如下:

{    "_id" : ObjectId("58eb7864eb61ee19bcccb8b9"),//唯一id    "filename" : "toolbars.xml",//文件名    "length" : NumberLong(620),//文件长度    "chunkSize" : 262144,//chunk大小    "uploadDate" : ISODate("2017-04-10T12:19:47.632Z"),//上传时间    "md5" : "aefbb40f9e349f2bf7caf32407cf6f6b",//文件md5值    "metadata" : {        "InsertTime" : "2017/4/10 20:19:46",        "userID" : "mjx"    }                          //文件其他信息}

对应fs.chunks中的chunk:

{    "_id" : ObjectId("58eb7864eb61ee19bcccb8ba"),//chunk的id    "files_id" : ObjectId("58eb7864eb61ee19bcccb8b9"),//文件id    "n" : 0,//文件的第几个chunk块,如果文件大于chunksize,会被分割成多个chunk快    "data" : { "$binary" : "", "$type" : "00" }//文件二进制数据,这里省略了具体内容}

文件的存与读:

~文件存入GridFS过程,如果文件大于chunksize,则把文件分割成多个chunk(文件片段),一般为256k/个,每个chunk将作为mongodb的一个文档(document)被存在chunks集合中,最后再把文件信息存入到fs.files中。
~读取文件的时候,先根据查询的条件,在fs.files中找到一个合适的记录,得到“_id”的值,再根据这个值到fs.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。

总结:

对于mongodb,BSON格式的数据(文档)存储有尺寸限制,最大为16M。GridFS适合大文件存储,刚好可以解决这个问题。

0 0
原创粉丝点击