標籤:mongodb 分布式 gridfs
GridFS是一個規範的儲存和檢索檔案超過16 mb的bson文檔大小限制。
而不是將檔案儲存體在一個文檔中,GridFS檔案分為部分,或塊,每個塊作為一個單獨的文檔。使用FridFS與使用分區無
關。在預設情況下網格檔案系統塊大小限制為255 k。GridFS檔案系統使用兩個集合隱藏檔。一個收集隱藏檔塊,
其他商店檔案中繼資料。
當你查詢GridFS檔案系統隱藏檔時,驅動或用戶端將重新組裝塊。你可以通過GridFS檔案系統上執行範圍查詢
檔案儲存體。你也可以從任意部分的檔案訪問資訊,你可以“跳過”的視頻或音頻檔案。
網格檔案系統不僅是有用的用於儲存超過16 mb的檔案,還用於儲存任何檔案,您想要訪問而不需要整個檔案載入到內
存中。
什麼情況下使用?
在MongoDB文檔集合,你應該總是使用GridFS隱藏檔大於16 MB。在某些情況下,在MongoDB資料庫比系統級檔案
系統儲存大檔案可能更有效。
(1)如果你的檔案系統限制一個目錄中的檔案的數量,你可以根據需要使用GridFS檔案系統儲存儘可能多的檔案。
(2)當你想讓你的檔案和中繼資料自動同步和部署多個系統和設施。當使用分布式複本集MongoDB可以分發檔案和
中繼資料自動產生mongod執行個體和設施。
(3)當您想要訪問的資訊來自部分大檔案,而無需全部檔案載入到記憶體中,您可以使用GridFS召回部分檔案不用
讀取整個檔案到記憶體中。
如果需要自動更新整個檔案的內容,不要使用GridFS。作為替代,你可以將每個檔案儲存體多個版本,每個檔案並指定中繼資料檔案的目前的版本。
當上傳新版本的檔案之後,您可以更新中繼資料欄位,在原子鐘標明最新狀態。之後刪除以前的版本。
實現GridFS
使用GridFS檔案系統來儲存和檢索檔案:
(1)引入驅動
(2)mongofiles mongo shell命令列工具。參考文檔 點擊開啟連結
GridFS集合
GridFS將檔案儲存體在兩個集合:
塊集合——儲存位元據塊。
塊中的每個文檔集合代表一個單獨的塊GridFS檔案。下面是一個原型文檔塊集合。
{ "_id" : <ObjectId>, "files_id" : <ObjectId>, "n" : <num>, "data" : <binary>}
該塊集合包含以下欄位:
chunks._id 獨特的ObjectId塊。
chunks.files_id 父類文檔事務id
chunks.n 塊的序號。GridFS檔案系統資料區塊,從0開始。
chunks.data 塊的有效載荷BSON二進位類型。
塊使用複合索引檔案集合id和n
檔案——隱藏檔的中繼資料。
每個文檔的檔案集合表示GridFS檔案系統中的一個檔案儲存體。考慮下面的原型文檔的檔案集合:
{ "_id" : <ObjectId>, "length" : <num>, "chunkSize" : <num>, "uploadDate" : <timestamp>, "md5" : <hash>, "filename" : <string>, "contentType" : <string>, "aliases" : <string array>, "metadata" : <dataObject>,}
文檔的檔案集合包含以下欄位的部分或全部。應用程式可以建立額外的任意欄位:
files._id 本文檔的惟一ID。id是為原始文檔選擇的資料類型。BSON ObjectId MongoDB文檔的預設類型。
files.length 檔案的大小(以位元組為單位)。
files.chunkSize 每個塊的大小。GridFS檔案系統將文檔劃分為指定的塊大小。預設大小是255位元組。2.4.10版
本的變化:預設從256 k到256 k塊大小改變。
files.uploadDate 文檔第一次由GridFS儲存的日期。這個值的日期類型。
files.md5 MD5散列filemd5返回的命令。這個值是字串類型。
files.filename 可選的。一個可讀的文檔的名稱。
files.contentType 可選的。一個合法的文檔的MIME類型。
files.aliases 可選的。一個別名字串數組。
files.metadata 可選的。想要儲存任何額外的資訊。
GridFS索引
GridFS檔案系統使用一個獨特的、複合索引檔案的塊集合id和n欄位。id欄位包含的id的檔案塊的“父”文檔。n
欄位包含塊的序號。網格檔案系統資料區塊,從0開始。
GridFS檔案系統索引允許使用的檔案塊的有效檢索id和n值,如以下樣本所示:
cursor = db.fs.chunks.find({files_id: myFileID}).sort({n:1});
如果你的驅動沒有建立這個索引,使用mongo shell執行以下操作:
db.fs.chunks.ensureIndex( { files_id: 1, n: 1 }, { unique: true } );
MongoDB——GridFS