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”这个文件存到库里面,具体用法如下:
[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的更多相关文章
- MongoDB整理笔记のMapReduce
MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...
- MongoDB整理笔记のjava MongoDB分页优化
最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...
- MongoDB整理笔记のID自增长
以下是官网原文地址: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 概要 MongoDB 的_i ...
- MongoDB整理笔记のReplica Sets + Sharding
MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding" ...
- MongoDB整理笔记の新增Shard Server
1.启动一个新Shard Server 进程 [root@localhost ~]# mkdir /data/shard/s2 [root@localhost ~]# /Apps/mongo/bin/ ...
- MongoDB整理笔记のSharding分片
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...
- MongoDB整理笔记の增加节点
MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境 ...
- MongoDB整理笔记の管理Replica Sets
一.读写分离 从库能进行查询,这样可以分担主库的大量的查询请求. 1.先向主库中插入一条测试数据 [root@localhost bin]# ./mongo --port 28010 MongoD ...
- MongoDB整理笔记のReplica oplog
主从操作日志oplog MongoDB的Replica Set架构是通过一个日志来存储写操作的,这个日志就叫做"oplog".oplog.rs是一个固定长度的capped coll ...
随机推荐
- dxjk服务器安装 lamp
安装Apache:用的下面的安装法命令用的是 yum -y install httpdhttp://blog.csdn.net/kesixin/article/details/72882469 mys ...
- 浅谈FPGA有限状态机
状态机几乎可以实现一切时序电路. 有限状态机(FiniteStateMachine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机.Moore型状态机输出仅仅 ...
- 蓝桥杯 算法训练 ALGO-108 最大的体积
算法训练 最大体积 时间限制:1.0s 内存限制:256.0MB 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积.假如每个物品有无限件可用,那么有些体积是永 ...
- linux 下SPI通信注意事项(待续)
一.2台Linux设备之间使用SPI通信 1.标准Linux只支持Master 模式.但是可以在驱动中修改为Slave模式: 2.硬件SPI可能支持Slave模式,也可能不支持.这个要提前确认好: 3 ...
- 分布式缓存系统 Memcached 主线程之main函数
前两节中对工作线程的工作流程做了较为详细的分析,现把其主要流程总结为下图: 接下来本节主要分析主线程相关的函数设计,主函数main的基本流程如下图所示: 对于主线程中的工作线程的初始化到启动所有的工作 ...
- Oracle 索引扫描的几种情况
index range scan(索引范围扫描): 1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行i ...
- python2 encode和decode函数说明
字符串编码常用类型:utf-8,gb2312,cp936,gbk等. python中,我们使用decode()和encode()来进行解码和编码 在python中,使用unicode类型作为编码的基础 ...
- Python多线程-守护线程
守护线程:守护着非守护线程,守护线程和非守护线程同时运行,当非守护线程运行结束后,无论守护线程有没有运行完,脚本都会停止运行 首先看一段普通的多线程实例 # -*- coding:utf-8 -*- ...
- HTTP协议头域详解
HTTP协议头域详解 Requests部分 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字符编 ...
- Java两种延时——thread和timer
在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread( ...