文档章节

MongoDB系列教程(八):GridFS存储详解

开元中国2015
 开元中国2015
发布于 2015/07/25 22:27
字数 1288
阅读 326
收藏 18

MongoDB系列教程(八):GridFS存储详解

GridFS简介

mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中。但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoDb会提供了一种处理大文件的规范--GridFS。

GridFS实现原理

在GridFS数据库中,默认使用fs.chunks 和fs.files来存储文件,其中fs.files集合存放文件的信息,fs.chunks存放文件的数据,一个fs.files集合中的一条记录内容如下,即一个file信息如下所示:

{   

"_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中出现垃圾数据,这些垃圾数据,可以定期清理掉。 

参考来源: 
MongoDB系列教程(八):GridFS存储详解
http://www.lai18.com/content/409594.html

延伸阅读

《MongoDB技术知识》系列技术文章整理收藏 

1mongoDB入门需要了解的基本知识

2MongoDB入门教程(包含安装、常用命令、相关概念、使用技巧、常见操作等)

3MongoDB入门教程之分片技术详解

4MongoDB入门教程之常用的运维技术介绍

5MongoDB入门教程之C#驱动操作实例

6MongoDB入门教程之主从复制配置详解

7MongoDB入门教程之聚合和游标操作介绍

8MongoDB入门教程之细说MongoDB数据库的增删查改操作

9MongoDB入门教程之索引操作浅析

10MongoDB入门教程之Windows下的MongoDB数据库安装图解

11MongoDB查询字段没有创建索引导致的连接超时异常解案例分享

12MongoDB日志文件过大的解决方法

13MongoDB社区版和企业版的差别对照表

14MongoDB中文社区发起人带你学习mongoDB

15对MongoDB数据库性能瓶颈分析

16MongoDB 分页查询的方法及性能

17MongoDB分片存储的集群架构实现

18Mongodb批量删除gridfs文件实例

19Mongodb增加、移除Shard Server实例

20Mongodb增加、移除Arbiter节点实例

21CentOS系统下MongoDB安装及配置教程

22MongoDB修改、删除文档的域属性实例

23Python中的MongoDB基本操作:连接、查询实例

24MongoDB导出查询结果到文件例子

25MongoDB中创建索引需要注意的事项

26MongoDB中的一些坑(最好不要用)

27给MongoDB添加用户权限方法分享

28Linux系统下MongoDB的简单安装与基本操作

29MongoDB教程之基本管理命令

30MongoDB教程之聚合(count、distinct和group)

31MongoDB教程之索引介绍

32MongoDB教程之数据操作实例

33MongoDB教程之入门基础知识

34MongoDB教程之查询操作实例

35MongoDB系列教程(四):设置用户访问权限

36MongoDB系列教程(八):GridFS存储详解

37MongoDB数据库的特色和优点介绍

38MongoDB简介 MongoDB五大特色

39MongoDB系列教程(六):java操作mongodb实例

40MongoDB系列教程(七):MongoDb数据结构详解

41MongoDB系列教程(五):mongo语法和mysql语法对比学习

42MongoDB系列教程(二):MongoDB简介

43MongoDB系列教程(一):NoSQL起源

44MongoDB中的MapReduce简介

45MongoDB系列教程(三):Windows中下载和安装MongoDB

46浅谈MongoDB的备份方式

47MongoDB 常用命令总结

48MongoDB与MySQL的操作对比表及区别介绍

49MongoDB安全配置详解

50MongoDB中的bson介绍和使用实例

© 著作权归作者所有

共有 人打赏支持
开元中国2015
粉丝 40
博文 54
码字总数 69948
作品 0
大兴
私信 提问
浅尝辄止MongoDB:GridFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82894835 一、为什么使用GridFS GridFS是MongoDB的一个子模块,使用GridFS可以基于M...

wzy0623
2018/09/29
0
0
MongoDB进阶系列(13)——GridFS大文件的添加、获取、查看、删除

GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种: 存储巨大的文件,比如视频、高清图片等。 利用GridFS可以简化需求。 GridFS会直接利用已经建立的复制或分片机...

HappyBKs
2015/03/17
0
0
Java MongoDB : Save image example

Java MongoDB : Save image example In this tutorial, we show you how to save an image file into MongoDB, via GridFS API. The GridFS APIs are able to serve other binary files as w......

引鸩怼孑
2015/05/22
0
0
mongoDB--GridFS简介

前言 :GridFS从名字来看,就明白是一个文件系统,它是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取). 使用场景:如果你的系统有如下情...

索隆
2013/04/15
0
1
基于GridFS+NGinx构建分布式文件系统 之实战(三)

基于GridFS构建分布式文件系统 首先看看什么是GridFS: GridFS is a mechanism for storing large binary files in MongoDB. There are several reasons why you might consider using GridF......

一枚Sir
2014/06/20
0
1

没有更多内容

加载失败,请刷新页面

加载更多

关于360插件化Replugin Activity动态修改父类的字节码操作

近期在接入360插件化方案Replugin时,发现出现崩溃情况。 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码......

Gemini-Lin
20分钟前
0
0
mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
15
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
4
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
5
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部