標籤:
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”這個檔案存到庫裡面,具體用法如下: [[email protected] 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”即可
[[email protected] bin]# ./mongofiles list connected to: 127.0.0.1 testfile 16
接下來我們進庫裡看一下是否有新的東西
[[email protected] 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中儲存的是一些實際的內容資料資訊
我們即然能將此檔案存進去,我們就應該有辦法將其取出來,下面看一下執行個體:
[[email protected] bin]# rm testfile rm:是否刪除 一般檔案 “testfile”? y --先刪檔案 [[email protected] bin]# ./mongofiles get testfile --將其從庫裡取出來 connected to: 127.0.0.1 done write to: testfile [[email protected] bin]# md5sum testfile --校正md5,結果跟庫裡相同 8addbeb77789ae6b2cb75deee30faf1a testfile [[email protected] 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