AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

GridFSによる大容量ファイルの保存

GridFS は BSON ドキュメント サイズ の制限である16 MB を超えるファイルを保存および取得するための仕様です。 GridFS は単一ドキュメントに大きなファイルを保存する代わりに、チャンクと呼ばれる複数の部分にファイルを分割してから各チャンクを別々のドキュメントとして保存します。

GridFS ストアでファイルをクエリすると、ドライバーは必要に応じてチャンクを再アセンブルします。

このガイドのコード例は、ドライバーソースコードGithubリポジトリの GridFSTour.javaファイルから取得されています。

このガイドのコード例を実行するには、プログラムに次のインポート ステートメントを含める必要があります。

import com.mongodb.reactivestreams.client.MongoClients;import com.mongodb.reactivestreams.client.MongoClient;import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.client.gridfs.model.*;import com.mongodb.reactivestreams.client.gridfs.*; import org.bson.Document;import org.bson.types.ObjectId; import java.io.FileNotFoundException;import java.io.IOException;import java.nio.Buffer;import java.nio.ByteBuffer;import java.nio.charset.StandardCharsets; import static com.mongodb.client.model.Filters.eq;import static reactivestreams.helpers.PublisherHelpers.toPublisher;

重要

このガイドでは、サンプル カスタム サブスクリプション実装ガイドで説明されているカスタムSubscriber実装を使用します。

まず、MongoDB 配置に接続し、 MongoDatabaseインスタンスを宣言して定義します。

次のコードは、ポート27017のlocalhostで実行されているスタンドアロンの MongoDB 配置に接続します。

MongoClient mongoClient = MongoClients.create();

MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。

GridFS はファイルを次の 2 つのコレクションに保存します。

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

  • files: stores file metadata

これら 2 つのコレクションは共通のバケット内にあり、コレクション名にはバケット名の前に付きます。

ドライバーは、 GridFSBucketインスタンスを作成するためのGridFSBuckets.create()メソッドを提供します。

MongoDatabase myDatabase = mongoClient.getDatabase("mydb"); // Create a gridFSBucket using the default bucket name "fs"GridFSBucket gridFSBucket = GridFSBuckets.create(myDatabase);

注意

GridFSfiles chunksバケットにデータをアップロードすると、 コレクションと コレクションにインデックスが自動的に作成されます。

バケット名をGridFSBuckets.create()メソッドに渡すことができます。

// Create a gridFSBucket with a custom bucket name "files"GridFSBucket gridFSFilesBucket = GridFSBuckets.create(myDatabase, "files");

Tip

タイムアウト設定

クライアント側の操作タイムアウト(COT)設定を使用して、サーバーがGridFS操作を完了できる時間を制限できます。GridFSでこの設定を使用する方法の詳細については、「 サーバー実行時間制限 」ガイドの「 GridFS 」セクションを参照してください。

GridFSBucket.uploadFromPublisher()メソッドはPublisher<ByteBuffer>の内容を読み取り、 GridFSBucketインスタンスに保存します。

GridFSUploadOptionsタイプを使用して、チャンク サイズを構成したり、追加のメタデータを含めたりできます。

次の例では、 Publisher<ByteBuffer>の内容をGridFSBucketにアップロードします。

// Get the input publisherPublisher<ByteBuffer> publisherToUploadFrom = toPublisher( ByteBuffer .wrap("MongoDB Tutorial..".getBytes(StandardCharsets.UTF_8))); // Create some custom optionsGridFSUploadOptions options = new GridFSUploadOptions() .chunkSizeBytes(1024) .metadata(new Document("type", "presentation")); ObservableSubscriber<ObjectId> uploadSubscriber = new OperationSubscriber<>();gridFSBucket.uploadFromPublisher("mongodb-tutorial", publisherToUploadFrom, options).subscribe(uploadSubscriber);ObjectId fileId = uploadSubscriber.get().get(0);

GridFSBucketに保存されているファイルを見つけるには、 find()メソッドを使用します。

次の例では、保存されている各ファイルのファイル名を出力します。

ConsumerSubscriber<GridFSFile> filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println(" - " + gridFSFile.getFilename()));gridFSBucket.find().subscribe(filesSubscriber);filesSubscriber.await();

また、カスタム フィルターを提供して、返される結果を制限することもできます。 次の例では、ユーザー定義メタデータ ドキュメント内のcontentType値がimage/png値であるすべてのファイルのファイル名を出力します。

filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println("Found: " + gridFSFile.getFilename()));gridFSBucket.find(eq("metadata.contentType", "image/png")).subscribe(filesSubscriber);filesSubscriber.await();

downloadToPublisher()メソッドは、MongoDB からコンテンツを読み取るPublisher<ByteBuffer>を返します。

ファイルをファイル_idでダウンロードするには、 _idを メソッドに渡します。 次の例では、ファイルを ファイル_idでダウンロードします。

ObjectId fileId;ObservableSubscriber<ByteBuffer> downloadSubscriber = new OperationSubscriber<>();gridFSBucket.downloadToPublisher(fileId).subscribe(downloadSubscriber);

ファイルの_idがわからないがファイル名がわかっている場合は、ファイル名をdownloadToPublisher()メソッドに渡すことができます。 デフォルトでは、 ファイルの最新バージョンがダウンロードされます。 ダウンロードするバージョンを構成するには、 GridFSDownloadOptionsクラスを使用します。

次の例では、 mongodb-tutorialという名前のファイルの元のバージョンをダウンロードします。

GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(0);downloadSubscriber = new OperationSubscriber<>();gridFSBucket.downloadToPublisher("mongodb-tutorial", downloadOptions).subscribe(downloadSubscriber);

ファイルの名前を変更する必要がある場合は、 rename()メソッドを使用します。

次の例では、ファイルの名前をmongodbTutorialに変更します。

ObjectId fileId; //ObjectId of a file uploaded to GridFSgridFSBucket.rename(fileId, "mongodbTutorial").subscribe(new ObservableSubscriber<Void>());

注意

rename()メソッドでは、正しいファイルの名前が変更されるように、 filenameではなくObjectIdが必要です。

同じファイル名の複数のリビルドの名前を変更するには、まずファイルの完全なリストを検索します。 次に、名前を変更するファイルごとに、対応する_idを使用してrename()を実行します。

GridFSBucketからファイルを削除するには、 delete()メソッドを使用します。

次の例では、 GridFSBucketからファイルを削除しています。

ObjectId fileId; //ObjectId of a file uploaded to GridFSgridFSBucket.delete(fileId).subscribe(new ObservableSubscriber<Void>());