大きなファイルの保存
項目一覧
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タブを選択します。
var options = new GridFSUploadOptions { ChunkSizeBytes = 1048576 // 1 MB }; using (var uploader = bucket.OpenUploadStream("my_file", options)) { // ASCII for "HelloWorld" byte[] bytes = { 72, 101, 108, 108, 111, 87, 111, 114, 108, 100 }; uploader.Write(bytes, 0, bytes.Length); uploader.Close(); }
var options = new GridFSUploadOptions { ChunkSizeBytes = 1048576 // 1 MB }; 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(); }
既存のストリームをアップロードする
ストリームの内容を新しい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対応するコードを表示するには、 タブまたは タブを選択します。
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "new_file"); var doc = bucket.Find(filter).FirstOrDefault(); if (doc != null) { var options = new GridFSDownloadOptions { Seekable = true }; using (var downloader = bucket.OpenDownloadStream(id, options)) { 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) { var options = new GridFSDownloadOptions { Seekable = true }; using (var downloader = await bucket.OpenDownloadStreamAsync(doc.Id, options)) { var buffer = new byte[downloader.Length]; await downloader.ReadAsync(buffer, 0, buffer.Length); // Process the buffer as needed } }
既存のストリームへのダウンロード
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ドキュメントを参照してください。