標籤:mongodb gridfs
GridFS簡介
mongoDB的文檔以BSON格式儲存,支援二進位的資料類型,當我們把二進位格式的資料直接儲存到mongoDB的文檔中。但是當檔案太大時,例片和視頻等檔案,每個文檔的長度是有限的,於是mongoDb會提供了一種處理大檔案的規範--GridFS。
GridFS實現原理
在GridFS資料庫中,預設使用fs.chunks 和fs.files來隱藏檔,其中fs.files集合存放檔案的資訊,fs.chunks存放檔案的資料,一個fs.files集合中的一條記錄內容如下,即一個file資訊如下所示:
<pre name="code" class="javascript">{ "_id" : ObjectId("4f4608844f9b855c6c35e298"), //唯一id,可以是使用者自訂的類型"filename" : "CPU.txt", //檔案名稱"length" : 778, //檔案長度"chunkSize" : 262144, //chunk的大小"uploadDate" : ISODate("2012-02-23T09:36:04.593Z"), //上傳時間"md5" : "e2c789b036cfb3b848ae39a24e795ca6", //檔案的md5值"contentType" : "text/plain" //檔案的MIME類型"meta" : null //檔案的其它資訊,預設是沒有”meta”這個key,使用者可以自己定義為任意BSON對象}
對應fs.chunks中的chunk(中文意思資料區塊),如下所示:
{ "_id" : ObjectId("4f4608844f9b855c6c35e299"), //chunk的id"files_id" : ObjectId("4f4608844f9b855c6c35e298"), //檔案的id,對應fs.files中的對象,相當於fs.files集合的外鍵"n" : 0, //檔案的第幾個chunk塊,如果檔案大於chunksize的話,會被分割成多個chunk塊"data" : BinData(0,"QGV...") //檔案的位元據,這裡省略了具體內容}
預設大小是256k,所以把檔案存入到GridFS過程中,如果檔案大於chunksize,則把檔案分割多個chunk,再把這些chunk儲存在fs.chunks中,最後再把檔案資訊存入fs.files中。
在讀取檔案的時候,先根據查詢的條件,在fs.files中找到一個合適的記錄,得到“_id”的值,再根據這個值到fs.funks中尋找所有files_id 為 _id 的chunk,並按照“n”排序,最後依次讀取chunk中的“data”對象的內容,還原成原來的檔案。
註:
1、GridFS不自動處理md5相同的檔案,對於md5相同的檔案,如果想在GridFS中只有一個儲存,要使用者處理,md5值的計算由用戶端完成。
2、因為GridFS在上傳檔案過程中是先把檔案資料儲存到fs.chunks,最後再把檔案的資訊儲存到fs.files中,所以如果上傳檔案過程中失敗,有可能在fs.chunks中出現垃圾資料,這些垃圾資料,可以定期清理掉。
MongoDB(八)Mongodb——GridFS儲存