Docs Menu
Docs Home
/ / /
C#/.NET
/

大きなファイルの保存

項目一覧

  • Overview
  • GridFS の仕組み
  • GridFS バケットの作成
  • バケットをカスタマイズする
  • ファイルのアップロード
  • アップロード ストリームへの書き込み
  • 既存のストリームをアップロードする
  • ファイルのダウンロード
  • ダウンロード ストリームからの読み取り
  • 既存のストリームへのダウンロード
  • ファイルの検索
  • ファイルの削除
  • API ドキュメント

このガイドでは、 GridFSを使用してMongoDBに大容量ファイルを保存、検索する方法を学びます。 GridFSストレージシステムは、保存時にファイルをチャンクに分割し、検索時にそれらのファイルを再アセンブルします。ドライバーのGridFSの実装は、ファイルストレージの操作と組織を管理する抽象化です。

いずれかのファイルのサイズがBSONドキュメントサイズ制限の16 MB を超える場合は、 GridFSを使用します。 GridFSがユースケースに適しているかどうかの詳細については、 MongoDB Serverマニュアルの GridFSを参照してください。

GridFS により、ファイルはバケット(ファイルのチャンクとそれを説明する情報を含む MongoDB コレクションのグループ)に整理されます。 バケットには以下のコレクションが含まれています。

  • chunks: バイナリファイルのチャンクを保存します

  • files:ファイルのメタデータを保存します

ドライバーは、最初にデータを書き込むと、 GridFSバケットがまだ存在しない場合はそれを作成します。バケットには、別の名前を指定しない限り、デフォルトのバケット名 fs がプレフィックスが付いた chunks コレクションと files コレクションが含まれます。ファイルと関連メタデータを効率的に取得するために、ドライバーは各コレクションにインデックスを作成します。ドライバーは、 GridFSバケットで読み取りおよび書込み操作を実行する前に、これらのインデックスが存在することを確認します。

GridFSインデックスの詳細については、 MongoDB Serverマニュアルの「 GridFSインデックス 」を参照してください。

GridFSを使用してファイルを保存する場合、ドライバーはファイルを小さなチャンクに分割し、各ファイルは chunksコレクションに個別のドキュメントとして表されます。また、ファイルID、ファイル名、およびその他のファイルメタデータを含むドキュメントを filesコレクションに作成します。

次の図は、 GridFSがバケットにアップロードされるときにファイルを分割する方法を示しています。

GridFS がファイルをバケットにアップロードする方法を示す図

ファイルを検索する際、GridFS は指定されたバケット内の files コレクションからメタデータを取得し、その情報を使用して chunks コレクション内のドキュメントからファイルを再構築します。

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クラスのプロパティを説明しています。

フィールド
説明

BucketName

ファイルとチャンク コレクションのプレフィックスとして使用するバケット名。デフォルト値は "fs" です。

データ型string

ChunkSizeBytes

GridFSがファイルを分割するチャンクのサイズ。デフォルト値は 255 KB です。

データ型integer

ReadConcern

バケット操作に使用する読み取り保証 ( 読み取り保証 (read concern) ) です。デフォルト値はデータベースの 読み取り保証 ( 読み取り保証 (read concern)) です。

データ型 : ReadConcern

ReadPreference

バケット操作に使用する読み込み設定 ( 読み込み設定 (read preference) ) 。デフォルト値はデータベースの 読み込み設定( 読み込み設定 (read preference)) です。

データ型: ReadPreference

WriteConcern

バケット操作に使用する書込み保証 ( 書込み保証 (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
説明

filename

アップロードするファイルの名前。

データ型string

options

GridFSUploadOptions任意。アップロード ストリームの構成を指定する クラスのインスタンス。デフォルト値はnull です。

データ型 : GridFSUploadOptions

cancellationToken

任意。操作をキャンセルするために使用できるトークン。

データ型 : 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クラスには、次のプロパティが含まれています。

プロパティ
説明

BatchSize

各バッチするでアップロードするチャンクの数。デフォルト値は、16MB を ChunkSizeBytesプロパティの値で割った値です。

データ型int?

ChunkSizeBytes

最後の チャンク を除く各チャンクのサイズは小さいです。デフォルト値は 255 KB です。

データ型int?

Metadata

ファイルに保存するメタデータ(次の要素を含む)。

  • ファイルの _id

  • ファイルの名前

  • ファイルの長さとサイズ

  • アップロード日時

  • その他の情報を保存できる metadataドキュメント

デフォルト値は null です。

データ型 : 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
説明

filename

アップロードするファイルの名前。

データ型string

source

ファイルの内容を読み取るストリーム。

データ型 : ストリーム

options

GridFSUploadOptions任意。アップロード ストリームの構成を指定する クラスのインスタンス。デフォルト値はnull です。

データ型 : GridFSUploadOptions

cancellationToken

任意。操作をキャンセルするために使用できるトークン。

データ型 : 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
説明

id

ダウンロードするファイルの _id 値。

データ型 : BsonValue

options

GridFSDownloadOptions任意。ダウンロード ストリームの構成を指定する クラスのインスタンス。デフォルト値はnull です。

データ型 : GridFSDownloadOptions

cancellationToken

任意。操作をキャンセルするために使用できるトークン。

データ型 : 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

ストリームが の検索をサポートしているかどうかを示します。この機能は、ストリーム内の現在の位置をクエリおよび変更する能力です。デフォルト値は です。false

データ型bool?

次の例では、前の例と同じ手順を実行しますが、ストリームが検索可能であることを指定するために 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
説明

id

ダウンロードするファイルの _id 値。

データ型 : BsonValue

destination

.NET/ C#ドライバーがGridFSファイルをダウンロードするストリーム。このプロパティの値は、Streamクラスを実装するオブジェクトである必要があります。

データ型 : ストリーム

options

GridFSDownloadOptions任意。ダウンロード ストリームの構成を指定する クラスのインスタンス。デフォルト値はnull です。

データ型 : GridFSDownloadOptions

cancellationToken

任意。操作をキャンセルするために使用できるトークン。

データ型 : 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
説明

filter

filesコレクション内の一致するエントリを指定するクエリフィルター。

データ型 :FilterDefinition<GridFSFileInfo> 。詳細については、 Find() メソッドのAPIドキュメントを参照してください。

source

ファイルの内容を読み取るストリーム。

データ型 : ストリーム

options

任意。検索操作の構成を指定するGridFSFindOptions クラスのインスタンス。デフォルト値はnull です。

データ型 : GridFSFindOptions

cancellationToken

任意。操作をキャンセルするために使用できるトークン。

データ型 : 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クラスには、次のプロパティが含まれています。

プロパティ
説明

Sort

結果のソート順。 ソート順を指定しない場合、 メソッドは挿入された順序で結果を返します。

データ型 :SortDefinition<GridFSFileInfo> 。詳細については、 ソートプロパティのAPIドキュメントを参照してください。

GridFSバケットからファイルを削除するには、GridFSBucketインスタンスで Delete() メソッドまたは DeleteAsync() メソッドを呼び出します。このメソッドは、ファイルのメタデータコレクションとそれに関連するチャンクをバケットから削除します。

Delete メソッドと DeleteAsync() メソッドは次のパラメータを受け入れます。

Parameter
説明

id

削除するファイルの_id

データ型 : BsonValue

cancellationToken

任意。操作をキャンセルするために使用できるトークン。

データ型 : 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ドキュメントを参照してください。

このページで使用されている GridFSBucketクラスのメソッドの詳細については、次のAPIドキュメントを参照してください。

戻る

地理空間で検索する