MongoDB 第6章 MongoDB GridFS

举报
许小强 发表于 2022/03/18 16:49:34 2022/03/18
【摘要】 GirdFS

1、简介

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

1.1、为什么要用GirdFS

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

1.2、如何实现海量存储

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

1.3、语言支持

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

1.4、简单介绍

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

files包含元数据对象
chunks包含其他一些相关信息的二进制块。
为了使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的GridFS存储将包括命名空间fs.files和fs.chunks。各种第三方语言的驱动有权限改变这个前缀,所以你可以尝试设置另一个GridFS命名空间用于存储照片,它的具体位置为:photos.files和photos.chunks,下面我们看一下实际例子。
1.5、命令行工具
mongofiles是从命令行操作GridFS的一种工具,比如我们/usr/local/xuz/test.html文件存到库里面,具体用法如下:
[root@localhost bin]# ./mongofiles put /usr/local/xuz/test.html 
connected to: 127.0.0.1
added file: { _id: ObjectId('54a8d33846d47e7bbe9a847a'), filename: "/usr/local/xuz/test.html", chunkSize: 261120, uploadDate: new Date(1420350265089), md5: "aead353cb437d4d29d61f05bb548b191", length: 31 }
done!
下面我们查看一下库里有哪些GridFS文件,在mongofiles后加一个参数list即可。
[root@localhost bin]# ./mongofiles list
connected to: 127.0.0.1
/usr/local/xuz/test.html        31
接下来我们进库里看一下是否有新的东西
[root@localhost bin]# ./mongo
MongoDB shell version: 2.6.6
connecting to: test
> show collections
c1
c2
c3
c4
fs.chunks   ----上文提到的fs.chunks
fs.files    ----上文提到的fs.files
system.indexes
system.js
xuz
我们继续查看fs.files中的内容
> db.fs.files.find();
{ "_id" : ObjectId("54a8d33846d47e7bbe9a847a"), "filename" : "/usr/local/xuz/test.html", "chunkSize" : 261120, "uploadDate" : ISODate("2015-01-04T05:44:25.089Z"), "md5" : "aead353cb437d4d29d61f05bb548b191", "length" : 31 }
字段说明:

Filename:存储的文件名
chunkSize:chunks分块的大小
uploadDate:入库的时间
md5:此文件的md5码
length:文件大小,单位字节
看来fs.files中存储的是一些基础的元数据信息。
我们继续查看fs.chunks中的内容
> db.fs.chunks.find();
{ "_id" : ObjectId("54a8d339deaed25af579df57"), "files_id" : ObjectId("54a8d33846d47e7bbe9a847a"), "n" : 0, "data" : BinData(0,"c2RzZHNkCnNkc2RzZApzZHNkcwpzZHNkcwpzZHNkCg==") }
其中比较重要的字段是n,它代表的是chunks的序号,此序号从0开始,看来fs.chunks中存储的是一些实际的内容数据信息。
我们既然能将此文件存进去,我们就应该有办法将其取出来,下面我们将该文件取出来。
[root@localhost bin]# cd /usr/local/xuz
[root@localhost xuz]# ls -l
total 4
-rw-r--r--. 1 root root 31 Jan  4 13:43 test.html
[root@localhost xuz]# rm -rf test.html --删除文件
[root@localhost xuz]# ll
total 0
[root@localhost bin]# ./mongofiles get /usr/local/xuz/test.html
connected to: 127.0.0.1
done write to: /usr/local/xuz/test.html
[root@localhost bin]# md5sum /usr/local/xuz/test.html    --检验md5,结果跟存进库里的相同
aead353cb437d4d29d61f05bb548b191  /usr/local/xuz/test.html
最后查看是否取出该文件。
[root@localhost bin]# cd /usr/local/xuz
[root@localhost xuz]# ll
total 4
-rw-r--r--. 1 root root 31 Jan  4 13:57 test.html     --成功取出文件
1.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});

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。