\1. 簡介
GridFS是MongoDB中存儲和查詢超過BSON文件大小限制(16M)的規范,不像BSON文件那樣在一個單獨的文檔中存儲文件,GridFS將文件分成多個塊,每個塊作為一個單獨的文檔。默認情況下,每個GridFS塊是255kB,意味着除了最后一個塊之外(根據剩余的文件大小),文檔被分成多個255kB大小的塊存儲。
GridFS使用兩個集合保存數據,一個集合存儲文件塊,另外一個存儲文件元數據。
當從GridFS中獲取文件時,MongoDB的驅動程序負責將多個塊組裝成完整文件,你可以通過GridFS進行范圍查詢,可以訪問文件的任意部分(例如跳到視頻文件或者音頻文件的任意位置)。
無論是超過16M的文件和其他文件,只要存在訪問時不想加載整個文件的場景存在,GridFS就有幫助。
\2. 應用場景
在MongoDB中,使用GridFS存儲超過16M的文件(BSON文件不能超過16M)。在某些情況下,MongoDB存儲大文件會比操作系統的文件系統更高效:
\1. 如果你的文件系統限制目錄下文件的個數,可以使用MongoDB在目錄下存儲任意多的文件。
\2. 訪問大數據文件時,不想一次加載而是分段訪問。
\3. 在多個系統間實現文件和元數據同步。
對文件進行原子更新時,MongoDB不適合,不能支持對文件多個塊更新操作的原子性;如果確有需要,也可以通過在元數據中指定當前版本來變通實現。
如果你的文件都小於16M,應該考慮使用每個文件存一個獨立文檔的方式來取代GridFS,可以使用BinData類型來存儲二進制數據(也可以使用GridFS,需要修改chunk大小,避免小文件被拆分,需要進行測試和比較性能)。
\3. 存儲管理
MongodB使用兩個集合來存儲GridFS文件,一個是fs.files,另一個是fs.chunks。
fs.files這個集合中存儲的是每一個上傳到數據庫的文檔的信息。
fs.chunks這個集合存儲的是上傳文件的內容。一個chunk相當於一個文檔(大文件被拆分成多個有序的chunk)。
GridFS中的bucket這個概念指代的是fs.files和fs.chunks的組合。