技術乾貨| 如何在MongoDB中輕鬆使用GridFS?
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將檔案儲存在兩個集合中:
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] |
分片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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 技術乾貨| MongoDB時間序列集合MongoDB
- 技術乾貨收集
- MongoDB之GridFSMongoDB
- 技術乾貨|威脅情報如何在SOC場景中發揮最大價值
- 阿里技術精華乾貨整理阿里
- 乾貨|輕鬆學DDD之一:模型驅動設計模型
- 技術乾貨| MongoDB如何查詢Null或不存在的欄位?MongoDBNull
- 乾貨 | 京東技術中臺的Flutter實踐之路Flutter
- 技術乾貨!聊聊介面設計中的動畫原理動畫
- MongoDB GridFS命令列工具mongofiles使用舉例MongoDB命令列
- 技術乾貨 | WebRTC 技術解析之 Android VDMWebAndroid
- 乾貨| 如何在自有App中引入小遊戲?APP遊戲
- [乾貨分享]1000篇乾貨好文!量子技術——資訊篇
- 技術乾貨丨如何在Docker環境下搭建測試管理平臺?Docker
- 【技術乾貨】程式碼示例:使用 Apache Spark 連線 TDengineApacheSpark
- Spring Data MongoDB支援GridFSSpringMongoDB
- 技術乾貨:RabbitMQ面試題及答案MQ面試題
- 技術乾貨:ActiveMQ面試題及答案MQ面試題
- [乾貨分享]1000篇乾貨好文!量子技術——進階篇
- 乾貨 | 裝置快速上雲,輕鬆搞定裝置與雲端通訊
- 【技術乾貨】程式碼示例:使用 Apache Flink 連線 TDengineApache
- 技術乾貨:Hadoop面試題及答案Hadoop面試題
- 2020文章合集 技術乾貨
- 技術乾貨 | 漫遊Linux塊IOLinux
- 乾貨!天翼雲DPU技術解碼
- 舉個例子!Tableau技巧(27):如何在Tableau中用Python(技術乾貨,建議收藏)Python
- 如何輕鬆拿到淘寶前端 offer | 掘金技術徵文前端
- 小團隊招聘 PHP技術員 工作輕鬆PHP
- 【同行說技術】教你玩轉iOS的5篇技術乾貨iOS
- 如何在Java中輕鬆處理Emoji Unicode - UdayakumarJavaUnicode
- [乾貨分享]1000篇乾貨好文!量子技術——專家觀點篇
- 【技術乾貨】聽阿里雲CDN安防技術專家金九講SystemTap使用技巧阿里
- 技術乾貨:spring boot面試題及答案Spring Boot面試題
- 「技術乾貨」Pontus-用友雲限流服務
- 技術乾貨 | WebRTC ADM 原始碼流程分析Web原始碼
- 技術乾貨|品高雲的SDN實踐
- 乾貨!谷歌推薦的技術能力提升指南谷歌
- 如何輕鬆拿到大廠面試offer | 掘金技術徵文面試