GridFS是一種在MongoDB中存儲大二進制文件的機制,使用GridFS的緣由有如下幾種:linux
存儲巨大的文件,好比視頻、高清圖片等。sql
利用GridFS能夠簡化需求。mongodb
GridFS會直接利用已經創建的複製或分片機制,故障恢復和擴展都很容易shell
GridFS能夠避免用戶上傳內容的文件系統出現問題。數據庫
GridFS不產生磁盤碎片。app
GridFS使用兩個表來存儲數據:工具
fiiles包含元數據對象(如文件的名稱、上傳的時間)spa
chunks包含其餘一些相關信息的二進制塊.net
爲了使度個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中的二進制數據都沒有了。