免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2072 | 回复: 0
打印 上一主题 下一主题

[MongoDB] [原创] MongoDB管理与开发精要《红丸出品》7 GridFS [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-30 19:04 |只看该作者 |倒序浏览
[backcolor=rgb(245, 247, 24]
[backcolor=rgb(245, 247, 24]第七章 GridFS
GridFS是一种将大型文件存储在MongoDB数据库中的文件规范。所有官方支持的驱动均实现了GridFS规范。
7.1 为什么要用GridFS
由于MongoDB中BSON对象大小是有限制的,所以GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。
7.2 如何实现海量存储
为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个chunk块对象可被组合保存在一个chunk块集合中。大多数情况下,你无需了解此规范中细节,而可将注意力放在各个语言版本的驱动中有关GridFS API的部分或是如何使用mongofiles工具上。
7.3 语言支持
GridFS对Java, Perl, PHP, Python, Ruby等程序语言均支持,且提供了良好的API接口。
7.4 简单介绍
GridFS使用两个表来存储数据:
l  files 包含元数据对象
l  chunks 包含其他一些相关信息的二进制块
为了使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的GridFS存储将包括命名空间fs.files和fs.chunks。各种第三方语言的驱动有权限改变这个前缀,所以你可以尝试设置另一个GridFS命名空间用于存储照片,它的具体位置为:photos.files和photos.chunks。下面我们看一下实际的例子吧。
7.5 命令行工具
mongofiles 是从命令行操作GridFS的一种工具,例如我们将”mongosniff”这个文件存到库里面,具体用法如下:
[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 }
字段说明:
l  Filename: 存储的文件名
l  chunkSize: chunks分块的大小
l  uploadDate: 入库时间
l  md5: 此文件的md5码
l  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]#
7.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});
-------------------------------------------------------------------
免费收几个想学数据库IT技术的徒弟(限北京)   
《MongoDB管理与开发精要》、《Redis实战》作者
新浪博客                  http://blog.sina.com.cn/u/2446082491
ChinaUnix.net专家 http://cdhongwan.blog.chinaunix.net
@CD红丸                http://weibo.com/u/2446082491
红丸IT培训群            http://q.weibo.com/1282646


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP