GridFS 是一种将大型文件存储在MongoDB 数据库中的文件规范。所有官方支持的驱动均实现了GridFS 规范。

GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。

官网学习:

http://www.mongodb.org/display/DOCS/GridFS

http://www.mongodb.org/display/DOCS/GridFS+Specification

1、为什么要用GridFS

由于MongoDB 中BSON 对象大小是有限制的,所以GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。

2、如何实现海量存储

为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个chunk 块对象可被组合保存在一个chunk 块集合中。大多数情况下,你无需了解此规范中细节,而可将注意力放在各个语言版本的驱动中有关GridFS API 的部分或是如何使用mongofiles 工具上。

3、语言支持

GridFS 对Java, Perl, PHP, Python, Ruby 等程序语言均支持,且提供了良好的API 接口。

 4、简单介绍

GridFS 使用两个表来存储数据:

files 包含元数据对象

chunks 包含其他一些相关信息的二进制块

为了使多个GridFS 命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的GridFS 存储将包括命名空间fs.files 和fs.chunks。各种第三方语言的驱动有权限改变这个前缀,所以你可以尝试设置另一个GridFS 命名空间用于存储照片,它的具体位置为:photos.files 和photos.chunks。下面我们看一下实际的例子吧。

5、命令行工具

mongofiles 是从命令行操作GridFS 的一种工具,例如我们将”testfile”这个文件存到库里面,具体用法如下:
[root@localhost bin]# ./mongofiles put testfile
connected to: 127.0.0.1
added file: { _id: ObjectId('4fc60175c714c5d960fff76a'), filename: "testfile", chunkSize: 262144,
uploadDate: new Date(1338376565745), md5: "8addbeb77789ae6b2cb75deee30faf1a", length:
16 }
done!

下面我们查一下看库里有哪些GridFS 文件,在”mongofiles”后加一个参数”list”即可

[root@localhost bin]# ./mongofiles list
connected to: 127.0.0.1
testfile 16

接下来我们进库里看一下是否有新的东西

 [root@localhost bin]# ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> show collections
fs.chunks --上文提到的fs.chunks
fs.files --上文提到的fs.files
system.indexes
system.js
>

我们继续查看fs.files 中的内容

> db.fs.files.find()
{ "_id" : ObjectId("4fc60175c714c5d960fff76a"), "filename" : "testfile", "chunkSize" : 262144,
"uploadDate" : ISODate("2012-05-30T11:16:05.745Z"), "md5" :
"8addbeb77789ae6b2cb75deee30faf1a", "length" : 16 }

字段说明:
    Filename: 存储的文件名
    chunkSize: chunks 分块的大小
    uploadDate: 入库时间
    md5: 此文件的md5 码
   length: 文件大小, 单位”字节”
    看来fs.files 中存储的是一些基础的元数据信息
    我们继续查看fs.chunks 中的内容

> db.fs.chunks.find()
{ "_id" : ObjectId("4fc60175cf1154905d949336"), "files_id" :
ObjectId("4fc60175c714c5d960fff76a"), "n" : 0, "data" :
BinData(0,"SGVyZSBpcyBCZWlqaW5nCg==") }

其中比较重要的字段是”n”,它代表的是chunks 的序号,此序号从0 开始,看来fs.chunks中存储的是一些实际的内容数据信息
    我们即然能将此文件存进去,我们就应该有办法将其取出来,下面看一下实例:

 [root@localhost bin]# rm testfile
rm:是否删除 一般文件 “testfile”? y --先删文件
[root@localhost bin]# ./mongofiles get testfile --将其从库里取出来
connected to: 127.0.0.1
done write to: testfile
[root@localhost bin]# md5sum testfile --校验md5,结果跟库里相同
8addbeb77789ae6b2cb75deee30faf1a testfile
[root@localhost bin]#

 6、索引

db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});

这样,一个块就可以利用它的files_id 和 n 的值进行检索。注意,GridFS 仍然可以用findOne得到第一个块,如下:

db.fs.chunks.findOne({files_id: myFileID, n: 0});

7、应用

MongoDB提供了一个命令行工具mongofiles可以来处理GridFS,在bin目录下。
    列出所有文件:
    mongofiles list
    上传一个文件:
    mongofiles put xxx.txt
   下载一个文件:
    mongofiles get xxx.txt
    查找文件:
    mongofiles search xxx    //会查找所有文件名中包含“xxx”的文件
    mongofiles list xxx //会查找所有文件名以“xxx”为前缀的文件

MongoDB整理笔记のGridFS的更多相关文章

  1. MongoDB整理笔记のMapReduce

    MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...

  2. MongoDB整理笔记のjava MongoDB分页优化

    最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...

  3. MongoDB整理笔记のID自增长

    以下是官网原文地址: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 概要 MongoDB 的_i ...

  4. MongoDB整理笔记のReplica Sets + Sharding

    MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding" ...

  5. MongoDB整理笔记の新增Shard Server

    1.启动一个新Shard Server 进程 [root@localhost ~]# mkdir /data/shard/s2 [root@localhost ~]# /Apps/mongo/bin/ ...

  6. MongoDB整理笔记のSharding分片

    这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...

  7. MongoDB整理笔记の增加节点

    MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境 ...

  8. MongoDB整理笔记の管理Replica Sets

    一.读写分离 从库能进行查询,这样可以分担主库的大量的查询请求.   1.先向主库中插入一条测试数据 [root@localhost bin]# ./mongo --port 28010 MongoD ...

  9. MongoDB整理笔记のReplica oplog

    主从操作日志oplog MongoDB的Replica Set架构是通过一个日志来存储写操作的,这个日志就叫做"oplog".oplog.rs是一个固定长度的capped coll ...

随机推荐

  1. Tomcat设置欢迎页问题

    今天下载了tomat9,配置到eclipse后拉起来,想跑个欢迎页看看是否起好了,随手写了个index.jsp放到项目Struts2的WebContent根目录下,直接打开网页输入http://loc ...

  2. Chrome 的审查元素功能有哪些奇技淫巧

    学习地址: https://www.zhihu.com/question/34682699

  3. (7)Stream简介

    流的个人理解: 怎样获得流: 怎样处理流: 中间操作和终端操作介绍: 中间操作和终端操作的使用: 流的个人理解: Stream也就是流,他和IO流不一样,他是java8诞生的东西,我对他的理解就是一个 ...

  4. FPGA中的“门”

    逻辑门 在ASIC的世界里,衡量器件容量的常用标准是等效门.这是因为不同的厂商在单元库里提供了不同的功能模块,而每个功能模块的实现都要求不同数量的晶体管.这样在两个器件之间比较容量和复杂度就很困难. ...

  5. mysql索引之八:myisam压缩(前缀压缩)索引

    myisam使用前缀压缩来减少索引的大小,从而让更多的索引可以放入内存中,默认只压缩字符串,但通过参数配置也可以对整数做压缩,myisam压缩每个索引块的方法是,先完全保存索引块中的第一个值,然后将其 ...

  6. 大杀器TheFatRat

    项目地址:https://github.com/Screetsec/TheFatRat 安装TheFatRat root@sch01ar:/sch01ar# git clone https://git ...

  7. 优化深度神经网络(三)Batch Normalization

    Coursera吴恩达<优化深度神经网络>课程笔记(3)-- 超参数调试.Batch正则化和编程框架 1. Tuning Process 深度神经网络需要调试的超参数(Hyperparam ...

  8. 分析比较多表查询中的IN与JOIN

    IN 是子查询的关键字,JOIN 是连接的关键字,项目开发中经常会使用到多表查询,而子查询与连接正是实现多表查询的重要途径.那两者是怎么运行的?IN与JOIN哪个更好?下面就来分析与比较. 现在有te ...

  9. JAVA基础知识总结17(网络编程)

    端口: 物理端口:IP地址 逻辑端口:用于标识进程的逻辑地址,不同进程的标识:有效端口:0~65535,其中0~1024系统使用或保留端口. JAVA中ip对象:InetAddress. import ...

  10. HashMap和HashSet的相同点和不同点

    Map集合,就是有一对属性值的集合,属性包含key,和value.关键字key是唯一不重复的.Map是一个有序的集合,所以查询起来速度很快.而HashSet就像是把HashMap中value去掉,说白 ...