MongoDB 进阶(GridFS)

??

GridFS是一种在MongoDB中存储大二进制文件的机制。使用GridFS存文件有如下几个原因:

● GridFS可以简化需求。如果已经用了MongoDB,GridFS就可以不需要独立的文件存储架构。

● GridFS利用已经建立的复制和分片机制,所以对于文件存储来说故障恢复和扩展都很容易。

● GridFS可以避免用于存储用户上传内容的文件系统出现的某些问题。例如:GridFS在同一目录下放置大量文件是没有任何问题的。

● GridFS不产生磁片,因为MongoDB分配的数据文件空间以2G为一块。

使用GridFS:mongofiles

mongofiles是GridFS的实用工具,用于管理GridFS文件

--帮助命令

[[email protected] ~]# mongofiles--help

Browse and modify a GridFSfilesystem.

usage: mongofiles [options]command [gridfs filename]

command:

one of (list|search|put|get)

list - list all files.  ‘gridfs filename‘ is an optional prefix

which listed filenames must beginwith.

search - search all files. ‘gridfs filename‘is a substring

which listed filenames must contain.

put - add a file with filename ‘gridfsfilename‘

get - get a file with filename ‘gridfsfilename‘

delete - delete all files with filename‘gridfs filename‘

options:

--help                                produce helpmessage

-v [ --verbose ]                      be more verbose (includemultiple times

formore verbosity e.g. -vvvvv)

--version                             print theprogram‘s version and exit

-h [ --host ] arg                     mongo host to connect to (<set

name>/s1,s2 for sets)

--port arg                            server port. Can also use --host

hostname:port

--ipv6                                enable IPv6support (disabled by

default)

-u [ --username ] arg                 username

-p [ --password ] arg                 password

--authenticationDatabase arg          user source (defaults to dbname)

--authenticationMechanism arg (=MONGODB-CR)

authentication mechanism

--dbpath arg                          directly accessmongod database files

in thegiven path, instead of

connecting to a mongod  server -needs

to lockthe data directory, so cannot

be usedif a mongod is currently

accessing the same path

--directoryperdb                      each db is in a separate directly

(relevant only if dbpath specified)

--journal                             enable journaling(relevant only if

dbpathspecified)

-d [ --db ] arg                       database to use

-c [ --collection ] arg               collection to use (somecommands)

-l [ --local ] arg                    local filename for put|get(default is

to usethe same name as ‘gridfs

filename‘)

-t [ --type ] arg                     MIME type for put (defaultis to omit)

-r [ --replace ]                      Remove other files withsame name after

PUT

--上传文件

[[email protected] ~]# mongofiles put foo.log

connected to: 127.0.0.1

added file: { _id:ObjectId(‘56caba480ad7ef0aa8a76f0c‘), filename: "foo.log", chunkSize:261120, uploadDate: new Date(1456126536618), md5:"d1bfff5ab0cc6b652aaf08345b19b7e6", length: 21 }

done!

--列出文件

[[email protected] ~]# mongofiles list

connected to: 127.0.0.1

install.log     54876

foo.log 21

--下载文件

[[email protected] ~]# rm -f foo.log

[[email protected] ~]# mongofiles get foo.log

connected to: 127.0.0.1

done write to: foo.log

[[email protected] ~]# ll foo.log

-rw-r--r--. 1 root root 21 2月  22 15:36 foo.log

--从Gridfs中删除一个文件

[[email protected] ~]# mongofiles deleteinstall.log

connected to: 127.0.0.1

done!

[[email protected] ~]# mongofiles list

connected to: 127.0.0.1

foo.log 21

Gridfs内部原理

Gridfs的基本思想就是可以将大文件分成很多块,每块作为一个单独的文档存储,这样就能存大文件了。它一个建立在普通MongoDB文档基础上轻量级文件规范。

由于MongoDB支持在文档存储二进制数据,可以最大限度减少块的存储开销。另外,除了存储文件本身的块,还有一个单独的文档用来存储分块的信息和文件的元数据。

Gridfs的块有个单独的fs.chunks集合(默认),块集合的文档结构如下:

{

"_id" : ObjectId("..."),

"n" : 0,

"data" :BinData("..."),

"files_id" :ObjectId("...")

}

●  _id:块的唯一ID

● files_id:包含这个块元数据的文件文档的id

● n:表示块编号,也就是这个块在原文件中顺序编号

● data:包含组成文件块的二进制数据

> db.fs.chunks.find()

{ "_id" :ObjectId("56caba48e0355316e5e4ab39"), "files_id" :ObjectId("56caba480ad7ef0aa8a76f0c"), "n" : 0,"data" : BinData(0,"SGVsbG8gTW9uZ29EQiBHcmlkZnMK") }

{ "_id" :ObjectId("56cabb85e0355316e5e4ab3a"), "files_id" :ObjectId("56cabb85d07cdd46e1f143a4"), "n" : 0,"data" : BinData(0,"SGVsbG8gTW9uZ29EQiBHcmlkZnMK") }

{ "_id" :ObjectId("56cabb89e0355316e5e4ab3b"), "files_id" :ObjectId("56cabb895c03f6feeb64bb6e"), "n" : 0,"data" :BinData(0,"5a6J6KOFIGxpYmdjYy00LjQuNy00LmVsNi54ODZfNjQKd2FybmluZzogbGliZ2NjLTQuNC43LTQuZWw2Lng4Nl82NDogSGVhZGVyIFYzIFJTQS9TSEEyNTYgU2lnbmF0dXJlLCBrZXkgSUQgZWM1NTFmMDM6IE5PS0VZCuWuieijhSBmb250cGFja2FnZXMtZmlsZXN5c3RlbS0xLjQxLTEuMS5lbDYu

......

--查询返回指定字段

>db.fs.chunks.find({},{"files_id":1,"n":1})

{ "_id" :ObjectId("56caba48e0355316e5e4ab39"), "files_id" :ObjectId("56caba480ad7ef0aa8a76f0c"), "n" : 0 }

{ "_id" :ObjectId("56cabb85e0355316e5e4ab3a"), "files_id" :ObjectId("56cabb85d07cdd46e1f143a4"), "n" : 0 }

{ "_id" :ObjectId("56cabb89e0355316e5e4ab3b"), "files_id" : ObjectId("56cabb895c03f6feeb64bb6e"),"n" : 0 }

Gridfs文件的元数据放在fs.files集合(默认)。这里没每个文档代表GridFS中的一个文件,与文件相关的自定义元数据也可以存在其中。

> db.fs.files.find()

{ "_id" :ObjectId("56caba480ad7ef0aa8a76f0c"), "filename" :"foo.log", "chunkSize" : 261120, "uploadDate" :ISODate("2016-02-22T07:35:36.618Z"), "md5" :"d1bfff5ab0cc6b652aaf08345b19b7e6", "length" : 21 }

{ "_id" :ObjectId("56cabb85d07cdd46e1f143a4"), "filename" :"foo.log", "chunkSize" : 261120, "uploadDate" :ISODate("2016-02-22T07:40:53.015Z"), "md5" :"d1bfff5ab0cc6b652aaf08345b19b7e6", "length" : 21 }

{ "_id" :ObjectId("56cabb895c03f6feeb64bb6e"), "filename" :"install.log", "chunkSize" : 261120, "uploadDate": ISODate("2016-02-22T07:40:57.387Z"), "md5" :"fbe1119cd9688d14475e2a84ccd8a7a6", "length" : 54876 }

● _id 文件的唯一id,在块中作为files_id键值存储

● length 文件内容总的字节数

● chunkSize 每块的大小(字节),默认是256K,必要时可调整

● uploadDate文件存入GridFS的时间戳

● md5 文件内容的md5的校验和,由服务器端生成。

在弄明白GridFS原理后,可对GridFS进行一些操作

--获取GridFS中不重复的文件列表

>db.fs.files.distinct("filename")

[ "foo.log","install.log" ]

时间: 2024-10-10 20:55:58

MongoDB 进阶(GridFS)的相关文章

MongoDB 进阶-关联查询

[苏州需要工作的加我QQ,内推介绍费平分] MongoDB 进阶 1.数据库命令 a.命令的工作原理 drop命令,在shell中删除一个集合,执行db.refactor.drop().其实这个函数实际运行的是drop命令, 可以用runCommand来达到一样的效果: db.runCommand({"drop":"refactor"}) {         "nIndexesWas" : 1,         "msg" :

MongoDB 进阶模式设计

转载: http://www.mongoing.com/mongodb-advanced-pattern-design 12月12日上午,TJ在开源中国的年终盛典会上分享了文档模型设计的进阶技巧,就让我们来回顾一下吧: —————————————————————————————————————————————————————————- 从很久以前,我就开始接触开源产品:从最开始的使用.受益者到后来的贡献者,到现在的热情推广者.现在,我是MongoDB的技术顾问.我的职责是为MongoDB的客户和

MongoDB之GridFS存储文件

1.MongoDB 的 GridFS 详细分析 GridFS简介 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件. http://www.mongodb.org/display/DOCS/GridFS http://www.mongodb.org/display/DOCS/GridFS+Specification GridFS使用 MongoDB提供了一个命令行工具mongofiles可以来处理GridFS,在bin目录下. 列出所有文件: mongofiles list

MongoDB进阶

MongoDB进阶 1.$type操作符 用途:使用MongoDB时,在需要根据字段的类型来查询数据时,可以使用$type操作符来完成. 语法:db.collection.find({字段:{$type:类型}}) 其中,类型的值可以使用以下列出的 Type Number Alias Notes Double 1 "double" String 2 "string" Object 3 "object" Array 4 "array&qu

MongoDB进阶系列(14)——GridFS大文件MD5验证

md5在上传之后都会保存在fs.files的元数据信息里,用来以后用户在get大文件之后比对md5值进行验证. linux中查看md5值的方法是: md5sum 文件名 那么我们就看看从Mongodb中get的文件的md5和MongoDB中存储的GridFS的md5是否一样. [[email protected] ~]$ sudo /usr/local/mongodb/bin/mongofiles put mongodbBook.tar.gz  [sudo] password for neil:

【MongoDB学习笔记28】MongoDB的GridFS存储机制

GridFS作为MongoDB的存储机制,用来存放二进制大文件: GridFS有以下优点: (1)使用GridFS简化存储栈,在MongoDB中替代独立的存储工具: (2)GridFS会自动平衡已有的复制和自动分片,对文件存储做故障转移挥着横向扩展会更容易: (3)MongoDB中以2GB的大小来分配数据文件,在GridFS中文件存储集中度会比较高: GridFS当然也有缺点: (1)从GridFS中读取文件没有直接从文件系统中快: (2)修改存放在GridFS中的文档,只有先删除就文档然后从新

MongoDB C++ gridfs worked example

使用libmongoc,参考:http://mongoc.org/libmongoc/current/mongoc_gridfs_t.html #include <mongoc.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> class MongoGridFS { public: MongoGridFS(const char* db); ~MongoGridFS(); void sav

【MongoDB学习笔记29】MongoDB的GridFS存储深入

GridFS的原理是将大文件分割为多个比较大的块,将每个块作为独立的文档进行存储. (1)GridFS中的块会被存贮到专用的集合中,默认为fs.chunks; (2)除了将文件的每一个块单独存储外,还需要将每个文件块的元信息放入一个文档存储,并将这些文档默认集中在fs.files集合中: 例如将foo.txt文档加入到数据库foo中: [[email protected] ~]# echo "hello world" >foo.txt    [[email protected] 

mongodb进阶一之高级查询

上篇文章我们讲了mongodb的crud基本操作 http://blog.csdn.net/stronglyh/article/details/46812579 这篇我们来说说mongodb的进阶--------------高级查询 一:各种查询 1:条件操作符 <, <=, >, >= 这个操作符就不用多解释了,最经常使用也是最简单的. db.collection.find({ "field" : { $gt: value } } ); // 大于: fiel