GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种:
存储巨大的文件,比如视频、高清图片等。
利用GridFS可以简化需求。
GridFS会直接利用已经建立的复制或分片机制,故障恢复和扩展都很容易
GridFS可以避免用户上传内容的文件系统出现问题。
GridFS不产生磁盘碎片。
GridFS使用两个表来存储数据:
fiiles包含元数据对象(如文件的名称、上传的时间)
chunks包含其他一些相关信息的二进制块
为了使度个GridF命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs。
所以任何默认的GridFS存储将包括命名空间fs.files和fs.chunks。(图片可以命名为ps.files和ps.chunks,视频可以命名为vs.files和vs.chunks)。
各种第三方语言可以更改其前缀。
本文是oschina的happyBKs的文章,请自己标明出处:http://my.oschina.net/u/1156339/blog/388156
使用GridFS mongofiles
mingofiles是从命令行操作GridFS的一种工具
三个命令:put(存储) get(取得) list(列表)
例如:我们将“testfile”这个文件存储到库中,具体做法是 ./mongofiles put testfile
首先,我们尝试压缩归档一个文件。
[neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list [sudo] password for neil: connected to: 127.0.0.1 [neil@neilhost ~]$ tar zcf mongodbBook.tar.gz Downloads/MongoDB权威指南.pdf [neil@neilhost ~]$ ll mongodbBook.tar.gz -rw-rw-r--. 1 neil neil 203 3月 16 19:10 mongodbBook.tar.gz
下面我们将这个归档文件存储到mongoDB中。默认存放到test数据库中。
[neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles put ./mongodbBook.tar.gz connected to: 127.0.0.1 added file: { _id: ObjectId('5506bc01581b37b38b49fecd'), filename: "./mongodbBook.tar.gz", chunkSize: 261120, uploadDate: new Date(1426504705885), md5: "85c0c93f51ebe9c609ffe4f9da71c63e", length: 203 } done! [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list connected to: 127.0.0.1 ./mongodbBook.tar.gz 203 [neil@neilhost ~]$
之后,我们进入mongodb客户端查看test数据库,发现里面多了两个集合,一个是fs.files,查看之后发现里面记录着上传文件的以下像信息:文件名称、上传时间、md5码、文件长度、大小等。
fs.chunks查看显示二进制信息。
[neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongo [sudo] password for neil: MongoDB shell version: 2.6.8 connecting to: test > show tables fs.chunks fs.files system.indexes > > > db.fs.files.find() { "_id" : ObjectId("5506bc01581b37b38b49fecd"), "filename" : "./mongodbBook.tar.gz", "chunkSize" : 261120, "uploadDate" : ISODate("2015-03-16T11:18:25.885Z"), "md5" : "85c0c93f51ebe9c609ffe4f9da71c63e", "length" : 203 } > db.fs.chunks.find() { "_id" : ObjectId("5506bc011b359e376ad0011e"), "files_id" : ObjectId("5506bc01581b37b38b49fecd"), "n" : 0, "data" : BinData(0,"H4sIADm6BlUAA+3OvwsBcRjH8a+uZOE/kNuYuOO+btetMvkD1CHFnfzISgYDZqWU0d9g4w+x3W1mq7uUkmKgpN6v4Xnq+Tz1PJY7ctpuze7nyq7TdK2Sv5l6u4m/mHnLVbZrN8TntEDR0MKum/Kh30gp9LzUdFkIiwhSwzCFqn3h9lvD/qDWU1Xh1FvtV3vv8j+VmsdEfB+tCuV8iMSDwXF7qXQS5va+MTaV9SmZFpmf/QgAAAAAAAAAAAAAAAAAeHYFpzavuwAoAAA=") } >
这个文件不大,所以二进制信息很短。
[neil@neilhost ~]$ du mongodbBook.tar.gz 4 mongodbBook.tar.gz
接下来,我尝试将mongodbBook.tar.gz的原文件删除,然后从mongodb中获取恢复。
这里用到的是mongofiles get命令。这里注意的是
[neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list connected to: 127.0.0.1 ./mongodbBook.tar.gz 203 [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles get mongodbBook.tar.gz connected to: 127.0.0.1 ERROR: file not found [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles get ./mongodbBook.tar.gz connected to: 127.0.0.1 done write to: ./mongodbBook.tar.gz [neil@neilhost ~]$ ll 总用量 44 drwxr-xr-x. 2 neil neil 4096 2月 13 18:36 Desktop drwxr-xr-x. 3 neil neil 4096 2月 13 21:35 Documents drwxr-xr-x. 5 neil neil 4096 3月 15 21:56 Downloads -rw-r--r--. 1 root root 203 3月 17 18:27 mongodbBook.tar.gz drwxr-xr-x. 2 neil neil 4096 2月 13 18:36 Music drwxr-xr-x. 3 neil neil 4096 3月 15 22:50 Pictures
这里需要注意的是,后面get的文件名称需要指定路径,这里要加上./,否则会显示文件不存在。
注意,这个./指的不是linux当前的路径,而是在Mongodb的文件存储中的路径。
之后,有put有get必有delete。
接下来看看如何删除MongoDB中的大文件.
[neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list [sudo] password for neil: connected to: 127.0.0.1 ./mongodbBook.tar.gz 203 [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles delete ./mongodbBook.tar.gz connected to: 127.0.0.1 done! [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list connected to: 127.0.0.1 [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongo MongoDB shell version: 2.6.8 connecting to: test > db test > show collections fs.chunks fs.files system.indexes > db.fs.files.find() > > db.fs.chunks.find() >
删除之后可以看到fs.files中的元数据和fs.chunk中的二进制数据都没有了。