第二部分 应用篇 第六章 MongoDB GridFS

声明:该文章主要来自《MongoDB实战》一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用

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文件存到库里面,具体用法如下:

[[email protected] 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即可。

[[email protected] bin]# ./mongofiles list

connected to: 127.0.0.1

/usr/local/xuz/test.html        31

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

[[email protected] 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中存储的是一些实际的内容数据信息。

我们既然能将此文件存进去,我们就应该有办法将其取出来,下面我们将该文件取出来。

[[email protected] bin]# cd /usr/local/xuz

[[email protected] xuz]# ls -l

total 4

-rw-r--r--. 1 root root 31 Jan  4 13:43 test.html

[[email protected] xuz]# rm -rf test.html --删除文件

[[email protected] xuz]# ll

total 0

[[email protected] bin]# ./mongofiles get /usr/local/xuz/test.html

connected to: 127.0.0.1

done write to: /usr/local/xuz/test.html

[[email protected] bin]# md5sum /usr/local/xuz/test.html    --检验md5,结果跟存进库里的相同

aead353cb437d4d29d61f05bb548b191  /usr/local/xuz/test.html

最后查看是否取出该文件。

[[email protected] bin]# cd /usr/local/xuz

[[email protected] 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});

时间: 2024-10-23 04:12:07

第二部分 应用篇 第六章 MongoDB GridFS的相关文章

第二部分 应用篇 第七章 MongoDB MapReduce

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

第二部分 应用篇 第五章 MongoDB高级查询

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. 本章将结合实际应用,重点阐述一些实际工作中最常用的方法. 面向文档的NoSQL数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能. MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似

第四部分 性能篇 第十一章 MongoDB 性能监控

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. 1.MongoStat 此工具可以快速的查看某组运行中的MongoDB实例的统计信息,用法如下: [[email protected] bin]# ./mongostat connected to: 127.0.0.1 insert query update delete g

第五部分 架构篇 第十六章 MongoDB Sharding 架构(理解分片)

1.简介 这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式的MongoDB集群. 那么首先我们应该理解何为分片(sharding)以及它的基本工作模式. 2.什么是分片 分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法,尽管分片起源于关系型数据库分区,但它(像MongoDB大部分方面一样)完全是另外一回事. 和你可能使用过的任何分区方案相比,MongoD

第五部分 架构篇 第十三章 MongoDB Replica Sets 架构(成员深入理解)

在学习复制的概念之前,首先接着前面一章节的还有点未完结的内容做个简单的介绍,主要是自动故障转移.异步复制.以及附加功能,这些在此只做简单的介绍,在以后的相关章节中会专门深入学习. 1.自动故障转移 当Primary服务和架构中其他成员中断通信超过10秒,Replica Set将尝试选举其他成员成为一个新的Primary服务,获得多票数的Scondary将成为Primary. 架构如下: 说明: 在一个Replica Set架构中,如果Primary不可达,则会在除Primary之外的其他成员中自

第一部分 基础篇 第三章 MongoDB体系结构

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台性,在不同的操作系统上虽然略有差别,但是从整体架构上来看,MongoDB在不同的平台上是一样的,如数据逻辑结构和数据存储等等. 一个运行着的MongoDB数据库就可以看成是一个MongoDB

第一部分 基础篇 第四章 MongoDB快速入门

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. MongoDB shell是MongoDB自带的交互式JavaScript shell,用来对MongoDB进行操作和管理的交互式环境. 使用./mongo --help可以查看相关连接参数,下面将从常见的操作,如插入.查询.修改.删除等几个方面阐述MongoDB shel

第一部分 基础篇 第四章 MongoDB查询

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. 1.查询记录 1.1.普通查询 在没有深入查询之前,我们先看看怎么从一个查询中返回一个游标对象,可以简单的通过find()来查询,它返回一个任意结构的集合,如果实现特定的查询在稍后讲解. 实现上面同样的查询,然后通过while来输出: > var cursor = d

第五部分 架构篇 第十七章 MongoDB Sharding 架构(理解块)

1.如何创建块 在前面的已经了解MongoDB分片架构中块的基本概念,那么在此来讲述如何创建块?当你决定分配数据时,必须为块区间选择一个键(前面我们一直在用username)这个键叫做片键(shard key),片键可以是任意字段或者字段的组合,比如如下文档中: <pre name="code" class="java"><pre name="code" class="java">{"user