GridFS是一种在Mongodb中存储大二进制文件的机制。GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。

使用GridFS有如下几个原因:

1 利用GridFS可以简化需求

2 GridFS会直接利用已建立的复制或分片机制,所以对于文件存储来说故障恢复和扩展都容易

3 GridFS可以避免用于存储用户上传内容的文件系统出现的某些问题。GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。

4 GridFS不产生磁盘碎片。

下面来看下具体的使用方法:

GridFS最近的使用方法就是采用mongofiles的命令,mongofiles可以用来在GridFS中上传,下载,显示文件。

(1)新建一个test.txt文档

root@zhf-maple:/home/zhf# echo "hello mongod" > test.txt

root@zhf-maple:/home/zhf# cat test.txt

hello mongod

(2)通过mongofiles上传

root@zhf-maple:/home/zhf# mongofiles put test.txt

2017-12-31T22:06:26.489+0800 connected to: localhost

added file: test.txt

(3)显示文件

root@zhf-maple:/home/zhf# mongofiles list

2017-12-31T22:06:41.308+0800 connected to: localhost

test.txt 13

(4)在本端删除掉该文件

root@zhf-maple:/home/zhf# rm test.txt

root@zhf-maple:/home/zhf# cat test.txt

cat: test.txt: 没有那个文件或目录

(5)从GridFS下载文件。

root@zhf-maple:/home/zhf# mongofiles get test.txt

2017-12-31T22:07:43.762+0800 connected to: localhost

finished writing to test.txt

root@zhf-maple:/home/zhf# cat test,txt

cat: test,txt: 没有那个文件或目录

root@zhf-maple:/home/zhf# cat test.txt

hello mongod

那么GridFS具体是如何存储文件的呢。前面介绍到GridFS是为了解决单个document不能超过16M的问题而推出的。通过将文件进行切分存成一个单独的集合:fs.chunks,并保存一个文件索引表:fs.files。在前面的例子中我们上传了一个test.txt文件。我们进入数据库看下是如何存储的。

在数据库中多了test数据库

> show dbs

admin  0.000GB

local  0.000GB

maple  0.000GB

test   0.000GB

在test数据库下有fs.chunks和fs.files两个集合。

> use test

switched to db test

> show collections

fs.chunks

fs.files

在chunks中字段解释如下:

_id:文件唯一的id

files_id:包含这个块元数据的文件文档的_id

n:表示块编号。也就是这个块在原文件中的顺序编号。这里为0代表只有一个块

data:组成文件块的二进制数据

> db.fs.chunks.find()

{ "_id" : ObjectId("5a48eee22d33c14783a13d55"), "files_id" : ObjectId("5a48eee22d33c14783a13d54"), "n" : 0, "data" : BinData(0,"aGVsbG8gbW9uZ29kCg==") }

在files中的字段解释如下:

_id:文件中唯一的id

length:文件长度

chunksize:每块的大小。以字节为单位

uploadDate:文件存入GridFS的时间戳

md5:文件内容的md5校验和。由服务器端生成。

> db.fs.files.find()

{ "_id" : ObjectId("5a48eee22d33c14783a13d54"), "chunkSize" : 261120, "uploadDate" : ISODate("2017-12-31T14:06:27.294Z"), "length" : 13, "md5" : "40a1f080f26be5a4c8cef7d78f974659", "filename" : "test.txt" }

mongodb学习之:GridFS的更多相关文章

  1. MongoDB学习笔记(二)--Capped集合 && GridFS存储文件

    Capped集合                                                            Capped集合的大小是固定的,如果空间都被用完了,新添加的对象 ...

  2. MongoDB学习笔记—Linux下搭建MongoDB环境

    1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...

  3. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  4. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  5. MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁

    权限                                                                                             绑定内网I ...

  6. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  7. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  8. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  9. MongoDB学习笔记六:进阶指南

    [数据库命令]『命令的工作原理』MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行.runCommand仅仅是接受命令文档,执行等价查询,因此,> db. ...

  10. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

随机推荐

  1. Nginx没有启动文件、nginx服务不支持chkconfig、nginx无法自启

    Nginx没有启动文件.nginx服务不支持chkconfig.nginx无法自启 问题描述: Nginx安装后,当想要设置Ngixn为开机启动时, 就需要把nginx的启动命令路径放到/etc/rc ...

  2. 遍历删除List中的元素,会报错?

    经常会碰到遍历集合,然后删除里面的对象报错, 纠结半天, 百度了一下,有大神说不能用for-each,  for , 只能用迭代器,真的吗?  我就删成功了呢,看代码,请大神们指正! public s ...

  3. PL/SQL Developer工具包和InstantClient连接Oracle 11g数据库

    一.前言 PLSQL Developer是Oracle数据库开发工具,很牛也很好用,PLSQL Developer功能很强大,可以做为集成调试器,有SQL窗口,命令窗口,对象浏览器和性能优化等功能. ...

  4. Codeforces Gym101606 E.Education (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    E Education 这个题有点意思,就是找满足条件的最小价格里的最大值的人数,有点贪心的思想吧,一开始写错了,人群的那个不能排序,而且是最小价格里找能住下人最多的部门,让这个部门去住这个房间.在循 ...

  5. http put/delete方式请求

    HttpClient使用Delete方式提交数据 1. http请求主要有以下几种方法来对指定资源做不同操作: HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指 ...

  6. Oracle内部latch获取函数简介

      标签: oracle call 函数   oracle statpack   转自: http://blog.51cto.com/458302/998775 Oracle的内部函数一直非常神秘,其 ...

  7. TdxBarButton的FASTSCRIPT封装

    TdxBarButton的FASTSCRIPT封装 // cxg 2017-2-13 unit fs_dev; interface{$i fs.inc}uses fs_iinterpreter, fs ...

  8. hibernater-validator jar包冲突的问题

    在引用hibernater-validator jar包时一直抛出异常,在引用带有该包的项目,或者同时在一个项目中使用该包和validator包都会抛出以下异常 最后发现是在Eclipse环境下,不能 ...

  9. 关于JavaScript禁止点击事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. tcp ip协议笔记(1)——简单介绍

    前言 本人记性不佳,看书健忘,以此笔记来记录看书后自己所知所想,已达到加深对tcp ip的理解.本笔记不过我看完书后自己所写的总结,权当是书后复习. 一.为什么会有tcp ip协议        ...