MongoDB整理笔记のGridFS

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”这个文件存到库里面,具体用法如下:
    [[email protected] 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”即可

[[email protected] bin]# ./mongofiles list
    connected to: 127.0.0.1
    testfile 16

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

 [[email protected] 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中存储的是一些实际的内容数据信息
    我们即然能将此文件存进去,我们就应该有办法将其取出来,下面看一下实例:

 [[email protected] bin]# rm testfile
    rm:是否删除 一般文件 “testfile”? y --先删文件
    [[email protected] bin]# ./mongofiles get testfile --将其从库里取出来
    connected to: 127.0.0.1
    done write to: testfile
    [[email protected] bin]# md5sum testfile --校验md5,结果跟库里相同
    8addbeb77789ae6b2cb75deee30faf1a testfile
    [[email protected] 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”为前缀的文件

时间: 2024-10-10 10:18:32

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

MongoDB整理笔记のMapReduce

MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中的所有记录,将key和value传递给Reduce函数进行处理.Map函数和Reduce函数可以使用JS来实现,可以通过db.runCommand或mapReduce命令来执行一个MapReduce操作. 示例she

MongoDB整理笔记のCRUD

添加 下面我们来建立一个test 的集合并写入一些数据.建立两个对象j 和t , 并保存到集合中去.在例子里 “>” 来表示是 shell 输入提示符    > j = { name : "mongo" };    {"name" : "mongo"}    > t = { x : 3 };    { "x" : 3 }    > db.things.save(j);    > db.things

MongoDB整理笔记の安装及配置

1.官网下载 地址:http://www.mongodb.org/downloads mongodb-linux-x86_64-2.4.9.tgz (目前为止,64位最新版本) 2.解压 切换到下载目录下,命令行输入: tar zxf mongodb-linux-x86_64-2.4.9.tgz 3.创建数据库文件夹和日志文件 命令行输入: mkdir /usr/local/mongodb/data touch /usr/local/mongodb/logs 上面两行命令代表,所有与mongod

MongoDB整理笔记の导入导出

一.导入 1.导入json数据 我们先将表user删除掉,以便演示效果: > db.user.drop(); true > show collections; system.indexes 然后导入数据 [[email protected] bin]#./mongoimport -d my_mongodb -c user user.dat connected to: 127.0.0.1 imported 2 objects [[email protected] bin]# 可以看到导入数据的时

MongoDB整理笔记の走进MongoDB世界

本人学习mongodb时间不长,但是鉴于工作的需要以及未来发展的趋势,本人想更深层的认识mongodb底层的原理以及更灵活的应用mongodb,边学边工作实践.  mongodb属于nosql中算是最热门的数据库,所以我们不妨对nosql有一个最基本的了解:  NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库.NoSQL 被我们用得最多的当数key-value 存储,当然还有其他的文档型的.列存储.图型数据库.xml 数据库等.与关系型数据库相比,关系型数据库给你强加了太多

MongoDB整理笔记の安全访问

MongoDB安全访问将从以下三个方面得到控制!   1.绑定IP内网地址访问MongoDB服务     2.设置监听端口     3.使用用户名和密码 绑定IP内网地址访问MongoDB服务 MongoDB可以限制只允许某一特定IP来访问,只要在启动时加一个参数bind_ip即可,如下: 服务端限制只有192.168.1.103这个IP可以访问MongoDB服务 [[email protected] bin]# ./mongod --bind_ip 192.168.1.103 客户端访问时需要

MongoDB整理笔记のGUI操作

值得幸运的是,其实MongoDB也有像类似于PL/SQL一样的界面操作工具操作MongoDB. 下面就来介绍几款不同的界面工具,大家各取所需! MongoVUE 主页:http://www.mongovue.com/ 一个桌面程序,提供了对MongoDB 数据库的基本操作,如查看.查询.更新.删除等,简单易用,但是功能还比较弱,以后发展应该不错.  RockMongo 主页:http://code.google.com/p/rock-php/ RockMongo 是一个PHP5 写的MongoD

MongoDB整理笔记のReplica Sets

MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台机器是用于写操作,正因为如此,MongoDB提供了数据一致性的保障.而担当primary角色的机器,可以把读的操作分发给slave. MongoDB高可用分两种:   Master-Slave 主从复制 只需要在某一个服务启动时加上–master 参数,而另一个服务加上–slave 与–source 参数,即可实现同步.MongoDB 的最新版本已不再推荐此方案. Replica Sets 复制集 Mono

MongoDB整理笔记のCapped Collection

1.简单介绍 capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时要预先指定大小.如果空间用完,新添加的对象将会取代集合中最旧的对象. 2.功能特点 可以插入及更新,但更新不能超出collection 的大小,否则更新失败.不允许删除,但是可以调用drop() 删除集合中的所有行,但是drop 后需要显式地重建集合.在32 位机