Overview
このガイドでは、 GridFS を使用してMongoDBに大容量ファイルを保存、検索する方法を学びます。GridFSストレージシステムは、保存時にファイルをチャンクに分割し、検索時にそれらのファイルを再アセンブルします。 ドライバーのGridFSの実装は、ファイルストレージの操作と組織を管理する抽象化です。
いずれかのファイルのサイズがBSONドキュメントサイズ制限の 16 MB を超える場合は、 GridFSを使用します。 GridFSがユースケースに適しているかどうかの詳細については、 MongoDB Serverマニュアルの GridFS を参照してください。
GridFS の仕組み
GridFS により、ファイルはバケット(ファイルのチャンクとそれを説明する情報を含む MongoDB コレクションのグループ)に整理されます。 バケットには以下のコレクションが含まれています。
chunks: バイナリファイルのチャンクを保存しますfiles:ファイルのメタデータを保存します
ドライバーは、最初にデータを書き込むと、 GridFSバケットがまだ存在しない場合はそれを作成します。 バケットには、別の名前を指定しない限り、デフォルトのバケット名 fs がプレフィックスが付いた chunks コレクションと files コレクションが含まれます。 ファイルと関連メタデータを効率的に取得するために、ドライバーは各コレクションにインデックスを作成します。 ドライバーは、 GridFSバケットで読み取りおよび書込み操作を実行する前に、これらのインデックスが存在することを確認します。
GridFSインデックスの詳細については、 MongoDB Serverマニュアルの「 GridFSインデックス 」を参照してください。
GridFS を使用してファイルを保存する場合、ドライバーはファイルを小さなチャンクに分割し、各ファイルは chunksコレクションに個別のドキュメントとして表されます。 また、ファイルID、ファイル名、およびその他のファイルメタデータを含むドキュメントを filesコレクションに作成します。
次の図は、 GridFSがバケットにアップロードされるときにファイルを分割する方法を示しています。

ファイルを検索する際、GridFS は指定されたバケット内の files コレクションからメタデータを取得し、その情報を使用して chunks コレクション内のドキュメントからファイルを再構築します。
GridFS バケットの作成
GridFS を使用してファイルを保存または検索するには、データベース を表す IMongoDatabaseオブジェクトを渡して、GridFSBucketクラスの新しいインスタンスを作成します。 このメソッドは、既存のバケットにアクセスし、バケットが存在しない場合は新しいバケットを作成します。
次の例では、 dbデータベースに GridFSBucketクラスの新しいインスタンスを作成します。
var client = new MongoClient("<connection string>"); var database = client.GetDatabase("db"); // Creates a GridFS bucket or references an existing one var bucket = new GridFSBucket(database);
バケットをカスタマイズする
GridFSバケット構成をカスタマイズするには、GridFSBucketOptionsクラスのインスタンスをGridFSBucket() コンストラクターに渡します。 以下の表では、GridFSBucketOptionsクラスのプロパティを説明しています。
フィールド | 説明 |
|---|---|
| ファイルとチャンク コレクションのプレフィックスとして使用するバケット名。 デフォルト値は データ型: |
| GridFS がファイルを分割するチャンクのサイズ。 デフォルト値は 255 KB です。 データ型: |
| バケット操作に使用する読み取り保証 (read concern)です。 デフォルト値はデータベースの読み取り保証 (read concern)です。 データ型: ReadConcern |
| バケット操作に使用する読み込み設定 (read preference) 。 デフォルト値はデータベースの読み込み設定 (read preference)です。 データ型: ReadPreference |
| バケット操作に使用する書込み保証 (write concern)。 デフォルト値はデータベースの書込み保証 (write concern)です。 データ型: WriteConcern |
次の例では、 GridFSBucketOptionsクラスのインスタンスをGridFSBucket() コンストラクターに渡して、"myCustomBucket" という名前のバケットを作成します。
var options = new GridFSBucketOptions { BucketName = "myCustomBucket" }; var customBucket = new GridFSBucket(database, options);
ファイルのアップロード
次の方法を使用して、 GridFSバケットにファイルをアップロードできます。
OpenUploadStream()またはOpenUploadStreamAsync(): 新しいアップロードストリームを開き、ファイルの内容を書き込むことができるUploadFromStream()またはUploadFromStreamAsync(): 既存のストリームの内容をGridFSファイルにアップロードします
次のセクションでは、これらのメソッドの使用方法について説明します。
アップロード ストリームへの書き込み
特定のファイル名でアップロードストリームを作成するには、OpenUploadStream() メソッドまたは OpenUploadStreamAsync() メソッドを使用します。 これらのメソッドは次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| アップロードするファイルの名前。 データ型: |
| 任意。アップロード ストリームの構成を指定する データ型: GridFSUploadOptions |
| 任意。操作 をキャンセルするために使用できるトークン。 データ型 : CancelToken |
このコード例では、次の手順を実行してアップロードストリームを開く方法を示しています。
OpenUploadStream()メソッドを呼び出して、"my_file"という名前のファイルの書込み可能なGridFSストリームを開きますWrite()メソッドを呼び出してmy_fileにデータを書込むClose()メソッドを呼び出して、my_fileを指すストリームを閉じる
対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
using (var uploader = bucket.OpenUploadStream("my_file")) { // ASCII for "HelloWorld" byte[] bytes = { 72, 101, 108, 108, 111, 87, 111, 114, 108, 100 }; uploader.Write(bytes, 0, bytes.Length); uploader.Close(); }
using (var uploader = await bucket.OpenUploadStreamAsync("my_file", options)) { // ASCII for "HelloWorld" byte[] bytes = { 72, 101, 108, 108, 111, 87, 111, 114, 108, 100 }; await uploader.WriteAsync(bytes, 0, bytes.Length); await uploader.CloseAsync(); }
アップロードストリーム構成をカスタマイズするには、GridFSUploadOptionsクラスのインスタンスをOpenUploadStream() メソッドまたは OpenUploadStreamAsync() メソッドに渡します。 GridFSUploadOptionsクラスには、次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| 各バッチするでアップロードするチャンクの数。 デフォルト値は、16MB を データ型: |
| 最後の チャンク を除く各チャンクのサイズは小さいです。 デフォルト値は 255 KB です。 データ型: |
| ファイルに保存するメタデータ(次の要素を含む)。
デフォルト値は データ型 : BsonDocument |
次の例では、前の例と同じ手順を実行しますが、各チャンクのサイズを指定するために ChunkSizeBytes オプションも使用しています。 対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
既存のストリームをアップロードする
ストリームの内容を新しいGridFSファイルにアップロードするには、UploadFromStream() メソッドまたは UploadFromStreamAsync() メソッドを使用します。 これらのメソッドは次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| アップロードするファイルの名前。 データ型: |
| ファイルの内容を読み取るストリーム。 データ型: ストリーム |
| 任意。アップロード ストリームの構成を指定する データ型: GridFSUploadOptions |
| 任意。操作 をキャンセルするために使用できるトークン。 データ型 : CancelToken |
このコード例では、次の手順を実行してアップロードストリームを開く方法を示しています。
/path/to/input_fileにあるファイルをバイナリ読み取りモードのストリームとして開きますUploadFromStream()メソッドを呼び出して、ストリームの内容を"new_file"という名前のGridFSファイルに書込みます
SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。
using (var fileStream = new FileStream("/path/to/input_file", FileMode.Open, FileAccess.Read)) { bucket.UploadFromStream("new_file", fileStream); }
using (var fileStream = new FileStream("/path/to/input_file", FileMode.Open, FileAccess.Read)) { await bucket.UploadFromStreamAsync("new_file", fileStream); }
ファイルのダウンロード
次の方法を使用して、 GridFSバケットからファイルをダウンロードできます。
OpenDownloadStream()またはOpenDownloadStreamAsync(): 新しいダウンロードストリームを開き、ファイルの内容を読み取ることができるDownloadToStream()またはDownloadToStreamAsync(): GridFSファイルの内容を既存のストリームに書込みます
次のセクションでは、これらの方法について詳しく説明します。
ダウンロード ストリームからの読み取り
ダウンロード ストリームを作成するには、OpenDownloadStream() メソッドまたは OpenDownloadStreamAsync() メソッドを使用します。 これらのメソッドは次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| ダウンロードするファイルの データ型 : BsonValue |
| 任意。ダウンロード ストリームの構成を指定する データ型 : GridFSDownloadOptions |
| 任意。操作 をキャンセルするために使用できるトークン。 データ型 : CancelToken |
次のコード例は、次の手順を実行してダウンロードストリームを開く方法を示しています。
"new_file"という名前のGridFSファイルの_id値を取得します。OpenDownloadStream()メソッドを呼び出し、_id値を渡してファイルを読み取り可能なGridFSストリームとして開きますファイルの内容を保存するために
bufferベクトルを作成しますRead()メソッドを呼び出して、downloaderストリームからベクトルにファイルの内容を読み取ります
SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "new_file"); var doc = bucket.Find(filter).FirstOrDefault(); if (doc != null) { using (var downloader = bucket.OpenDownloadStream(doc.Id)) { var buffer = new byte[downloader.Length]; downloader.Read(buffer, 0, buffer.Length); // Process the buffer as needed } }
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "new_file"); var cursor = await bucket.FindAsync(filter); var fileInfoList = await cursor.ToListAsync(); var doc = fileInfoList.FirstOrDefault(); if (doc != null) { using (var downloader = await bucket.OpenDownloadStreamAsync(doc.Id)) { var buffer = new byte[downloader.Length]; await downloader.ReadAsync(buffer, 0, buffer.Length); // Process the buffer as needed } }
ダウンロードストリーム構成をカスタマイズするには、GridFSDownloadOptionsクラスのインスタンスをOpenDownloadStream() メソッドに渡します。 GridFSDownloadOptionsクラスには、次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| ストリームが の検索をサポートしているかどうかを示します。この機能は、ストリーム内の現在の位置をクエリおよび変更する能力。デフォルト値は データ型: |
次の例では、前の例と同じ手順を実行しますが、ストリームが検索可能であることを指定するために Seekable オプションを true に設定しています。
SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。
既存のストリームへのダウンロード
GridFSファイルの内容を既存のストリームにダウンロードするには、DownloadToStream() メソッドまたは DownloadToStreamAsync() メソッドを使用します。 これらのメソッドは次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| ダウンロードするファイルの データ型 : BsonValue |
| .NET/ C#ドライバーがGridFSファイルをダウンロードするストリーム。 このプロパティの値は、 データ型: ストリーム |
| 任意。ダウンロード ストリームの構成を指定する データ型 : GridFSDownloadOptions |
| 任意。操作 をキャンセルするために使用できるトークン。 データ型 : CancelToken |
次のコード例は、次のアクションを実行して既存のストリームにダウンロードする方法を示しています。
/path/to/output_fileにあるファイルをバイナリ書込みモードのストリームとして開きます"new_file"という名前のGridFSファイルの_id値を取得します。DownloadToStream()メソッドを呼び出し、_id値を渡して"new_file"の内容をストリームにダウンロード
SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "new_file"); var doc = bucket.Find(filter).FirstOrDefault(); if (doc != null) { using (var outputFile = new FileStream("/path/to/output_file", FileMode.Create, FileAccess.Write)) { bucket.DownloadToStream(doc.Id, outputFile); } }
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "new_file"); var cursor = await bucket.FindAsync(filter); var fileInfoList = await cursor.ToListAsync(); var doc = fileInfoList.FirstOrDefault(); if (doc != null) { using (var outputFile = new FileStream("/path/to/output_file", FileMode.Create, FileAccess.Write)) { await bucket.DownloadToStreamAsync(doc.Id, outputFile); } }
ファイルの検索
GridFSバケット内のファイルを検索するには、GridFSBucketインスタンスで Find() メソッドまたは FindAsync() メソッドを呼び出します。 これらのメソッドは次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
|
データ型 : |
| ファイルの内容を読み取るストリーム。 データ型: ストリーム |
| 任意。検索操作の構成を指定する データ型 : GridFSFindOptions |
| 任意。操作 をキャンセルするために使用できるトークン。 データ型 : CancelToken |
次のコード例は、 GridFSバケット内のファイルからファイルメタデータを検索して印刷する方法を示しています。 Find() メソッドは、結果にアクセスできる IAsyncCursor<GridFSFileInfo>インスタンスを返します。 foreachループを使用して返されたカーソルを反復処理し、 ファイルのアップロード例 にアップロードされたファイルの内容を表示します。
SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。
var filter = Builders<GridFSFileInfo>.Filter.Empty; var files = bucket.Find(filter); foreach (var file in files.ToEnumerable()) { Console.WriteLine(file.ToJson()); }
{ "_id" : { "$oid" : "..." }, "length" : 13, "chunkSize" : 261120, "uploadDate" : { "$date" : ... }, "filename" : "new_file" } { "_id" : { "$oid" : "..." }, "length" : 50, "chunkSize" : 1048576, "uploadDate" : { "$date" : ... }, "filename" : "my_file" }
var filter = Builders<GridFSFileInfo>.Filter.Empty; var files = await bucket.FindAsync(filter); await files.ForEachAsync(file => Console.Out.WriteLineAsync(file.ToJson()))
{ "_id" : { "$oid" : "..." }, "length" : 13, "chunkSize" : 261120, "uploadDate" : { "$date" : ... }, "filename" : "new_file" } { "_id" : { "$oid" : "..." }, "length" : 50, "chunkSize" : 1048576, "uploadDate" : { "$date" : ... }, "filename" : "my_file" }
検索操作 をカスタマイズするには、GridFSFindOptionsクラスのインスタンスをFind() メソッドまたは FindAsync() メソッドに渡します。 GridFSFindOptionsクラスには、次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| 結果のソート順。 ソート順を指定しない場合、 メソッドは挿入された順序で結果を返します。 データ型 : |
ファイルの削除
GridFSバケットからファイルを削除するには、GridFSBucketインスタンスで Delete() メソッドまたは DeleteAsync() メソッドを呼び出します。 このメソッドは、ファイルのメタデータコレクションとそれに関連するチャンクをバケットから削除します。
Delete メソッドと DeleteAsync() メソッドは次のパラメータを受け入れます。
Parameter | 説明 |
|---|---|
| 削除するファイルの データ型 : BsonValue |
| 任意。操作 をキャンセルするために使用できるトークン。 データ型 : CancelToken |
次のコード例は、 "my_file" という名前のファイルを削除する方法を示しており、その _id 値を delete_file() に渡します。
Buildersクラスを使用して、"my_file"という名前のファイルに一致するフィルターを作成しますFind()メソッドを使用して"my_file"という名前のファイルを検索しますファイルの
_id値をDelete()メソッドに渡してファイルを削除します
SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "new_file"); var doc = bucket.Find(filter).FirstOrDefault(); if (doc != null) { bucket.Delete(doc.Id); }
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "new_file"); var cursor = await bucket.FindAsync(filter); var fileInfoList = await cursor.ToListAsync(); var doc = fileInfoList.FirstOrDefault(); if (doc != null) { await bucket.DeleteAsync(doc.Id); }
注意
ファイルの変更
Delete() メソッドと DeleteAsync() メソッドは、一度に 1 つのファイルの削除のみをサポートします。各ファイルリビジョニング、または同じファイル名を共有するアップロード時間が異なるファイルを削除するには、各リビジョニングの _id 値を収集します。次に、Delete() メソッドまたは DeleteAsync() メソッドへの個別の呼び出しで、各 _id 値を渡します。
API ドキュメント
このページで使用されるクラスの詳細については、次のAPIドキュメントを参照してください。
このページで使用されている GridFSBucketクラスのメソッドの詳細については、次のAPIドキュメントを参照してください。