GridFS は、BSON ドキュメントのサイズ制限である 16 MiB を超えるファイルを保存および取得するための仕様です。
注意
GridFS はマルチドキュメントトランザクションをサポートしません。
Instead of storing a file in a single document, GridFS divides the file into parts, or chunks [1], and stores each chunk as a separate document. By default, GridFS uses a chunk size of 255 KiB; that is, GridFS divides a file into chunks of 255 KiB with the exception of the last chunk. The last chunk is only as large as necessary. Similarly, files that are no larger than the chunk size only have a final chunk, using only as much space as needed plus some additional metadata.
GridFS は 2 つのコレクションを使用してファイルを保存します。一方のコレクションにはファイルのチャンクが保存され、もう一方のコレクションにはファイルのメタデータが保存されます。
GridFSでファイルをクエリすると、ドライバーは必要に応じてチャンクを再アセンブルします。GridFSを使って保存されたファイルには、範囲クエリを実行できます。ファイルの任意のセクションから情報にアクセスすることもできます。たとえば、ビデオやオーディオを含むファイルの途中に「スキップ」できます。
GridFS は 16 MiB を超えるファイルを保存するだけでなく、ファイルをメモリ全体に読み込むことなくアクセスしたい任意のファイルを保存するのにも役立ちます。GridFS の用途も参照してください。
GridFS の用途
16 MiB を超えるファイルの保存にはGridFS を使用します。
状況によっては、MongoDB データベースの方がシステムレベルのファイルシステムよりも大きなファイルを保存するには効率的な場合があります。
ご使用のファイルシステムでディレクトリ内のファイル数が制限されている場合でも、GridFS を使用すると必要な数のファイルを保存できます。
ファイル全体をメモリにロードせずに、大きなファイルの一部にアクセスするには、 GridFS を使用します。
複数のシステムや施設間でファイルとメタデータを同期、配置する場合、 GridFS を使用します。地理的に分散されたレプリカセットを使用すると、 MongoDB はファイルとそのメタデータを複数の施設にわたる
mongodインスタンスに分散します。
ファイル全体のコンテンツをアトミック的に更新する必要がある場合は、GridFS を使用しないでください。代替策として、各ファイルの複数のバージョンを保存し、メタデータでファイルの現在のバージョンを指定することができます。新しいバージョンのファイルをアップロードした後、アトミック更新で「最新」ステータスを示すメタデータ フィールドを更新し、必要に応じて後で以前のバージョンを削除できます。
すべてのファイルが 16 MiB BSON document サイズ の制限より小さい場合は、 GridFSを使用する代わりに、各ファイルを単一documentに保存するとよいでしょう。binary データを保存するには、BinDataデータ型を使用します。BinData の使用に関する詳細については、ドライバー のドキュメントを参照してください。
GridFS の使用
GridFS を使用してファイルを保存および取得するには、次のいずれかの方法を使用します。
MongoDB ドライバー。 ドライバーで GridFS を使用する方法について詳しくは、ドライバーのドキュメントを参照してください。
mongofilesコマンドライン ツール。ドキュメントについては、mongofilesに関する参考資料を参照してください。
GridFS コレクション
GridFS はファイルを次の 2 つのコレクションに保存します。
chunksはバイナリ チャンクを保存します。詳細については、「chunksコレクション」を参照してください。filesはファイルのメタデータを保存します。詳細については、「filesコレクション」を参照してください。
GridFS は、各コレクションの先頭にバケット名を付けて、コレクションを共通のバケットに配置します。デフォルトでは、GridFS は fs という名前のバケットを持つ次の 2 つのコレクションを使用します。
fs.filesfs.chunks
別のバケット名を選択したり、単一データベースに複数のバケットを作成したりすることもできます。バケット名を含む完全なコレクション名には、名前空間の長さ制限が適用されます。
chunks コレクション
Each document in the chunks [1] collection represents a distinct chunk of a file as represented in GridFS. Documents in this collection have the following form:
{ "_id" : <ObjectId>, "files_id" : <ObjectId>, "n" : <num>, "data" : <binary>}chunks コレクションのドキュメントには、次のフィールドが含まれています。
chunks._idチャンクのユニーク ObjectId。
chunks.dataBSON
Binary型のチャンクのペイロード。
files コレクション
files コレクション内の各ドキュメントは、GridFS 内のファイルを表します。
{ "_id" : <ObjectId>, "length" : <num>, "chunkSize" : <num>, "uploadDate" : <timestamp>, "md5" : <hash>, "filename" : <string>, "contentType" : <string>, "aliases" : <string array>, "metadata" : <any>,}files コレクション内のドキュメントには、次のフィールドの一部またはすべてが含まれています。
files.chunkSizeバイト単位での各チャンクのサイズ。GridFS は、ドキュメントを
chunkSizeサイズのチャンクに分割します。ただし、最後のチャンクは例外的に必要なサイズのみになります。デフォルトサイズは 255 キビバイト(KiB)です。
files.md5非推奨
MD5 アルゴリズムは FIPS 140-2 によって禁止されています。MongoDB ドライバーは MD5 のサポートを廃止し、将来のリリースで MD5 の生成を削除する予定です。アプリケーションでファイル ダイジェストが必要な場合は、GridFS の外部で実装し、
files.metadataに保存する必要があります。filemd5コマンドによって返される完全なファイルの MD5 ハッシュ。この値はString型です。
files.contentType非推奨
任意。GridFS ファイルの有効な MIME タイプ。アプリケーション専用です。
GridFS ファイルの MIME タイプに関連する情報を保存するには、
files.metadataを使用します。
files.aliases非推奨
任意。エイリアス文字列の配列。アプリケーション専用です。
エイリアス情報の保存には、
files.metadataを使用します。
GridFS Indexes
GridFS は効率ために、chunks と files コレクションのそれぞれでインデックスを使用します。ドライバー に準拠したGridFS仕様 は、これらのインデックスを自動的に作成します。また、アプリケーションに合わせて追加のインデックスを作成することもできます。
chunks インデックス
GridFS は files_id と n フィールドを使用する chunks で、ユニーク複合インデックスを使用します。これにより、以下に例示するとおり、チャンクを効率的に取得できます。
db.fs.chunks.find( { files_id: myFileID } ).sort( { n: 1 } )GridFS仕様に準拠するドライバーは、読み取りおよび書込み操作の前にこのインデックスが存在することを自動的に確認します。GridFSアプリケーションの具体的な動作については、関連する ドライバー のドキュメントを参照してください。
このインデックスが存在しない場合は、mongosh を使用して次のインデックス作成操作を発行できます。
db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );files インデックス
GridFS はfilename と uploadDate を使用する files コレクションでインデックスを使用します。このインデックスにより、以下に例示するとおり、ファイルを効率的に取得できます。
db.fs.files.find( { filename: myFileName } ).sort( { uploadDate: 1 } )GridFS仕様に準拠するドライバーは、読み取りおよび書込み操作の前にこのインデックスが存在することを自動的に確認します。GridFSアプリケーションの具体的な動作については、関連する ドライバー のドキュメントを参照してください。
このインデックスが存在しない場合は、mongosh を使用して次のインデックス作成操作を発行できます。
db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );| [1] | (1, 2) The use of the term chunks in the context of GridFS is not related to the use of the term chunks in the context of sharding. |
シャーディング用 GridFS
GridFS には、files と chunks の 2 つのコレクションがあります。
chunks コレクション
chunks コレクションをシャーディングするには、{ files_id : 1, n : 1 } または { files_id : 1 } のいずれかをシャードキー インデックスとして使用します。files_id は ObjectId であり、単調に変化します。
アップロードの成功を確認するために filemd5 を実行しない MongoDB ドライバーには、chunks コレクションにハッシュされたシャーディングを使用できます。
MongoDB ドライバーが filemd5 を実行する場合、ハッシュされたシャーディングは使用できません。詳細については、SERVER-9888 を参照してください。
files コレクション
files コレクションは小さく、メタデータのみが含まれています。GridFS の必須キーはいずれもシャーディングされた環境での均等な分散には適していません。files をシャーディングされないままにしておくと、すべてのファイル メタデータ ドキュメントを 1 つのシャード上に置くことができます。
files コレクションを どうしても シャーディングしなければならない場合は、_id フィールドを使用し、場合によってはアプリケーションフィールドと組み合わせて使用してください。