Docs Menu
Docs Home
/ / /
Java Reactive Streams ドライバー
/

GridFS

項目一覧

  • 前提条件
  • MongoDB 配置への接続
  • GridFS バケットの作成
  • GridFS へのアップロード
  • GridFS に保存されているファイルの検索
  • 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インスタンスを宣言して定義します。

次のコードは、ポート27017localhostで実行されているスタンドアロンの 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);

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

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

注意

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

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

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

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

// Get the input publisher
Publisher<ByteBuffer> publisherToUploadFrom = toPublisher(
ByteBuffer
.wrap("MongoDB Tutorial..".getBytes(StandardCharsets.UTF_8))
);
// Create some custom options
GridFSUploadOptions 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 GridFS
gridFSBucket.rename(fileId, "mongodbTutorial").subscribe(new ObservableSubscriber<Void>());

注意

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

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

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

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

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

戻る

トランザクション