技術乾貨| 如何在MongoDB中輕鬆使用GridFS?

MongoDB中文社群發表於2022-04-14

GridFS 是用於儲存和檢索超過16 MB 大小限制 BSON 文件檔案的規範。

注意

GridFS 不支 多文件事務

相較於將一個檔案儲存在單條文件中,GridFS將檔案分為多個部分或塊 [1] ,並將每個塊儲存為單獨的文件。預設情況下,GridFS使用的塊預設大小為255kB;也就是說,除最後一個塊,GridFS會將檔案劃分為255 kB的塊。最後一個塊只有必要的大小。同樣,最後的那個塊也不會大於預設的塊大小,僅使用所需的空間以及一些其他後設資料。

GridFS使用兩個集合來儲存檔案。一個集合儲存檔案塊,另一個集合儲存檔案後設資料。  GridFS集合 一節詳細介紹了每個集合。

當你從GridFS查詢檔案時,驅動程式將根據需要重新組裝該檔案所有的塊。你可以對GridFS儲存的檔案進行範圍查詢。你還可以從檔案的任意部分訪問其資訊,例如“跳到”視訊或音訊檔案的中間。

GridFS不僅可用於儲存超過16 MB的檔案,而且還可用於儲存您要訪問的任何檔案而不必將整個檔案載入到記憶體中。另請參閱何時使用 GridFS


什麼時候使用GridFS


在MongoDB中,使用 GridFS 儲存大於16 MB的檔案。

在某些情況下,在MongoDB資料庫中儲存大型檔案可能比在系統級檔案系統上儲存效率更高。

  • 如果檔案系統限制了目錄中檔案的數量,則可以使用GridFS來儲存所需數量的檔案。

  • 當你要訪問大檔案部分的資訊而不必將整個檔案載入到記憶體中時,可以使用GridFS來呼叫檔案的某些部分,而無需將整個檔案讀入記憶體。

  • 當你希望保持檔案和後設資料在多個系統和設施之間自動同步和部署時,可以使用GridFS。使用 地理分佈的複製集 時,MongoDB可以自動將檔案及其後設資料分發到多個 mongod 例項和設施。

如果您需要對整個檔案的內容進行原子更新,請不要使用GridFS。或者,您可以儲存每個檔案的多個版本,並在後設資料中指定檔案的當前版本。上傳檔案的新版本後,您可以原子更新後設資料中指示為“最新”狀態的欄位,然後在需要時刪除以前的版本。

此外,如果檔案均小於16 MB  BSON文件大小 限制,請考慮將每個檔案儲存在單個文件中,而不是使用GridFS。您可以使用BinData資料型別儲存二進位制資料。有關使用BinData的詳細資訊,請參見 驅動 程式文件。


使用GridFS


要使用 GridFS 儲存和檢索檔案,請使用以下任一方法:

  • MongoDB驅動程式。請參閱 驅動程式 文件,以獲取有關將GridFS與驅動程式一起使用的資訊。

  • mongofiles 命令列工具。有關文件,請參見 mongofiles 參考。


GridFS Collections


GridFS將檔案儲存在兩個集合中:

  • 塊儲存二進位制塊。有關詳細資訊,請參見 chunks集合

  • 檔案儲存檔案的後設資料。有關詳細資訊,請參見 檔案集合

GridFS通過使用儲存桶名稱為每個集合新增字首,將集合放置在一個公共儲存桶中。預設情況下,GridFS使用兩個集合以及一個名為fs的儲存桶:

  • fs.files

  • fs.chunks

您可以選擇其他儲存桶名稱,也可以在一個資料庫中建立多個儲存桶。完整集合名稱(包括儲存桶名稱)受 名稱空間長度限制

塊集合

[1] 集合中的每個文件都代表了GridFS中表示的檔案的不同的塊。此集合中的文件具有以下格式:

{  "_id" : <ObjectId>,  "files_id" : <ObjectId>,  "n" : <num>,  "data" : <binary>}

chunks集合中的文件包含以下欄位:

  • chunks._id

    塊的唯一 ObjectId

  • chunks.files_id

    files 集合中指定的“父”文件的 _id

  • chunks.n

    塊的序列號。GridFS從0開始對所有塊進行編號。

  • chunks.data

    BSON 二進位制型別的荷載。

檔案集合

檔案集合中的每個文件代表GridFS中的一個 檔案

{  "_id" : <ObjectId>,  "length" : <num>,  "chunkSize" : <num>,  "uploadDate" : <timestamp>,  "md5" : <hash>,  "filename" : <string>,  "contentType" : <string>,  "aliases" : <string array>,  "metadata" : <any>,}

files 集合中的文件包含以下一些或全部欄位:

  • files._id

    該文件的唯一識別符號。  _id 是您為原始文件選擇的資料型別。MongoDB文件的預設型別是 BSON ObjectId

  • files.length

    文件的大小(以位元組為單位)。

  • files.chunkSize

    每個塊的大小(以位元組為單位)。GridFS將文件分為大小為 chunkSize 的塊,最後一個除外,後者僅根據需要而變大。預設大小為255 KB。

  • files.uploadDate

    GridFS首次儲存這個文件的日期。此值為有 日期 型別。

  • files.md5

    過期

    FIPS 140-2禁止使用MD5演算法。MongoDB驅動程式已棄用MD5支援,並將在未來版本中刪除MD5的生成。需要檔案摘要的應用程式應在GridFS外部實現它,並將其儲存在 files.metadata 中。

    filemd5 命令返回的完整檔案的MD5雜湊。此值為字串型別。

  • files.filename

    可選的。GridFS檔案的可讀名稱。

  • files.contentType

    過期

    可選的。GridFS檔案的有效MIME型別。僅應用程式用。

    使用 files.metadata 來儲存與GridFS檔案的MIME型別有關的資訊。

  • files.aliases

    過期

    可選的。別名字串陣列。僅用於應用程式

    使用 files.metadata 來儲存與GridFS檔案的MIME型別有關的資訊。

  • files.metadata

    可選的。後設資料欄位可以是任何資料型別,並且可以儲存您要儲存的任何其他資訊。如果希望將其他任意欄位新增到檔案集合中的文件,請將其新增到後設資料欄位中的物件。


GridFS索引


GridFS使用每個塊和檔案集合上的索引來提高效率。為了方便起見,符合 GridFS規範 驅動程式 會自動建立這些索引。您還可以根據需要建立任何其他索引,以滿足您的應用程式需求。

chunks索引

GridFS 使用 files_id n 欄位在 chunks 集合上使用 唯一 複合 索引。可以有效地檢索塊,如以下示例所示:

db.fs.chunks.find( { files_id: myFileID } ).sort( { n: 1 } )

符合 GridFS規範 驅動程式 將在讀取和寫入操作之前自動確保此索引存在。有關GridFS應用程式的特定行為,請參閱相關的驅動程式文件。

如果該索引不存在,則可以執行以下操作以使用 mongo  shell建立它:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

files索引

GridFS files 集合上的 filename uploadDate 欄位上使用 索引 。該索引允許高效地檢索檔案,如本示例所示:

db.fs.files.find( { filename: myFileName } ).sort( { uploadDate: 1 } )

符合 GridFS規範 驅動程式 將在讀取和寫入操作之前自動確保此索引存在。有關GridFS應用程式的特定行為,請參閱相關的驅動程式文件。

如果該索引不存在,則可以執行以下操作以使用 mongo  shell建立它:

db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );

[1]

( 1 2 ) 在GridFS上下文中使用術語塊與在分片上下文中使用術語塊無關。



分片GridFS


GridFS考慮兩個集合-files和chunks。

chunks集合

要分片chunks集合,請使用{ files_id : 1, n : 1 } 或{ files_id : 1 } 作為分片鍵索引。files_id是一個 ObjectId ,並且 單調 更改。

對於不執行 filemd5 來驗證成功上傳的MongoDB驅動程式(例如,支援MongoDB 4.0或更高版本的MongoDB驅動程式),可以將 雜湊分片 用於chunks集合。

如果MongoDB驅動程式執行 filemd5 ,則不能使用 Hashed Sharding 。有關詳細資訊,請參閱 SERVER-9888

files集合

files集合很小,僅包含後設資料。G ridFS所需的所有金鑰都不適合在分片環境中進行平均分配。保留未分片的files允許所有檔案後設資料文件保留在主分片上。

如果必須分片files集合,請使用_id欄位,可能與應用程式欄位結合使用。


原文連結:

https://github.com/mongodb-china/MongoDB-CN-Manual/blob/master/cun-chu/gridfs.md


關於作者: 張琦


Java 開發工程師,陝西西安。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69961190/viewspace-2887138/,如需轉載,請註明出處,否則將追究法律責任。

相關文章