MongoDB——GridFS 清疚 2022-06-16 00:40 215阅读 0赞 上篇文章提到MongoDB内置GridFS,支持海量存储。那么GridFS具体是如何存储的呢?有何特殊之处呢? 在实际系统开发中,经常会有上传图片或文件的功能,这些文件可能尺寸很大。。我们可以借用GridFS来辅助管理。 ### GridFS结构: ### ![这里写图片描述][SouthEast] MongoDBGridFS由表名.files和表名.chunks构成,前者存文件信息,后者存文件的内容,两者再通过\_id与files\_id建立关联。 **.files:** ![这里写图片描述][SouthEast 1] **.chunks:** ![这里写图片描述][SouthEast 2] 一个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适合大文件存储,刚好可以解决这个问题。 [SouthEast]: /images/20220616/9da71872b32e462397d1960efb1162df.png [SouthEast 1]: /images/20220616/34c40e1436cb41f7a21c9588c5c271ee.png [SouthEast 2]: /images/20220616/ecf4a8d8835f4e45ba61aa3c3f2c523f.png
还没有评论,来说两句吧...