第二部分 應用篇 第六章 MongoDB GridFS

來源:互聯網
上載者:User

標籤: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 }
欄位說明:

  • Filename:儲存的檔案名稱
  • chunkSize:chunks分塊的大小
  • uploadDate:入庫的時間
  • md5:此檔案的md5碼
  • length:檔案大小,單位位元組
看來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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.