MongoDB(八)Mongodb——GridFS存储,mongodbgridfs存储
GridFS简介
mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中。但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoDb会提供了一种处理大文件的规范--GridFS。
GridFS实现原理
在GridFS数据库中,默认使用fs.chunks 和fs.files来存储文件,其中fs.files集合存放文件的信息,fs.chunks存放文件的数据,一个fs.files集合中的一条记录内容如下,即一个file信息如下所示:
<pre name="code" class="javascript">{
"_id" : ObjectId("4f4608844f9b855c6c35e298"), //唯一id,可以是用户自定义的类型
"filename" : "CPU.txt", //文件名
"length" : 778, //文件长度
"chunkSize" : 262144, //chunk的大小
"uploadDate" : ISODate("2012-02-23T09:36:04.593Z"), //上传时间
"md5" : "e2c789b036cfb3b848ae39a24e795ca6", //文件的md5值
"contentType" : "text/plain" //文件的MIME类型
"meta" : null //文件的其它信息,默认是没有”meta”这个key,用户可以自己定义为任意BSON对象
}对应fs.chunks中的chunk(中文意思数据块),如下所示:
{
"_id" : ObjectId("4f4608844f9b855c6c35e299"), //chunk的id
"files_id" : ObjectId("4f4608844f9b855c6c35e298"), //文件的id,对应fs.files中的对象,相当于fs.files集合的外键
"n" : 0, //文件的第几个chunk块,如果文件大于chunksize的话,会被分割成多个chunk块
"data" : BinData(0,"QGV...") //文件的二进制数据,这里省略了具体内容
}默认大小是256k,所以把文件存入到GridFS过程中,如果文件大于chunksize,则把文件分割多个chunk,再把这些chunk保存在fs.chunks中,最后再把文件信息存入fs.files中。
在读取文件的时候,先根据查询的条件,在fs.files中找到一个合适的记录,得到“_id”的值,再根据这个值到fs.funks中查找所有files_id 为 _id 的chunk,并按照“n”排序,最后依次读取chunk中的“data”对象的内容,还原成原来的文件。
注:
1、GridFS不自动处理md5相同的文件,对于md5相同的文件,如果想在GridFS中只有一个存储,要用户处理,md5值的计算由客户端完成。
2、因为GridFS在上传文件过程中是先把文件数据保存到fs.chunks,最后再把文件的信息保存到fs.files中,所以如果上传文件过程中失败,有可能在fs.chunks中出现垃圾数据,这些垃圾数据,可以定期清理掉。
这个是由于同一系统下域名改变或者不同系统下用了同一个域名导致不同实例访问出错:
改变域名后,重启下所有mongod/mongos实例,应该就可以了。
给你推荐一份资料,叫《深入浅出MongoDB应用实战开发(基础、开发指南、系统管理、集群及系统架构)》有22课时,侧重于讲解MongoDB的常用特性及高级特性,从实际开发的角度出发对MongoDB进行全方位深入剖析。具体内容如下:可以联系我 1511065175
MongoDB基础:
第一讲:nosql与MongoDB(nosql兴起的背景、各种nosql数据库介绍,MongoDB的特点)
第二节:MongoDB安装配置 (MongoDB安装使用,基本系统管理的技巧,web控制台使用)
第三讲:MongoDB shell详解 (介绍MongoDB shell使用及命令,备份恢复、数据导入导出)
第四讲:MongoDB文档、集合、数据库的概念(介绍文档、集合、数据库等基本概念,库文件存储方式,命令规则)
第五讲:Mongodb 数据类型介绍 (详细介绍MongoDB支持数据类型)
MongoDB开发指南:
第六讲:MongoDB增、删、改文档(讲解MongoDB中增加、删除、修改文档的命令,插入原理、批量修改、修改器使用)
第七讲:MongoDB查询语法一 (详细讲解MongoDB强大的查询功能,$in、$or、$ne、$lt、$gt等操作符组合查询)
第八讲:MongoDB查询语法二(详细讲解MongoDB强大的查询功能,正则表达式查询、数组查询、内嵌文档查询)
第九讲:MongoDB查询语法三(详细讲解MongoDB where查询,游标操作、分页查询及代码示例、游标内幕)
第十讲:MongoDB索引(详细讲解MongoDB的索引原理、管理、索引查询分析工具、强制索引使用等)
第十一讲:MongoDB聚合统计(讲解MongoDB聚合统计功能)
第十二讲:MongoDB高级指南-命令工作原理(介绍数据库命令的工作原理)
第十三讲:MongoDB高级指南-固定集合、GridFS(介绍固定集合、GridFS原理及应用)
第十四讲:MongoDB高级指南-服务端脚本(介绍服务端脚本dbeval、javascript存储)
MongoDB系统管理:
第十五讲:MongoDB系统管理高级技巧1(系统监控)
第十六讲:MongoDB系统管理高级技巧2(数据库安全、备份恢复、数据修复)
MongoDB集群及系统架构:
第十七讲:MongoDB复制功能(详细讲解MongoDB主从复制建立、管理、维护)
第十八讲:MongoDB副本集功能(详细讲解MongoDB副本集建立、管理、维护)
第十九讲:MongoDB分片功能(详细讲解MongoDB分片建立、管理、维护)
第二十讲:MongoDB内幕( 深入剖析MongoDB系统架构、数据文件结构原理)
MongoDB应用案例:
第二十一讲:基于MongoDB通用帐号管理系统开发1
第二十二讲:基于MongoDB通用帐号管理系统开发2