GridFS は、BSON ドキュメントのサイズ制限である 16 MiB を超えるファイルを保存および取得するための仕様です。
注意
GridFS はマルチドキュメントトランザクションをサポートしません。
GridFS は単一documentにファイルを保存する代わりに、チャンク [1] と呼ばれる複数の部分にファイルを分割してから各チャンクを 別々のdocumentとして保存します。デフォルトでは 、 GridFS は255 KeyB のチャンク サイズを使用します。つまり、 GridFS はファイルを最後のチャンクを除いて 255 Kit のチャンクに分割します。最後のチャンクのサイズは必要な範囲に留まります。同様に、ファイルが チャンク サイズ を超えない場合、そのファイルは最終チャンクのみとなり、必要な範囲内の領域と追加のメタデータを使用します。
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 コレクション
chunks [1] コレクション内の各ドキュメントは、GridFS と表記されるファイルの個別チャンクを表します。このコレクションのドキュメントは次の形式をとります。
{ "_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) GridFS に関してチャンクという用語が使用される場合とシャーディングに関してチャンクという用語が使用される場合に関連性はありません。 |
シャーディング用 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 フィールドを使用し、場合によってはアプリケーションフィールドと組み合わせて使用してください。