標籤: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 }
欄位說明:
看來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});
第二部分 應用篇 第六章 MongoDB GridFS