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 配置への接続
まず、MongoDB 配置に接続し、 MongoDatabase
インスタンスを宣言して定義します。
次のコードは、ポート27017
のlocalhost
で実行されているスタンドアロンの MongoDB 配置に接続します。
MongoClient mongoClient = MongoClients.create();
MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。
GridFS バケットの作成
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
バケットにデータをアップロードすると、 コレクションと コレクションにインデックスが自動的に作成されます。
GridFS へのアップロード
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);
GridFS に保存されているファイルの検索
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();
GridFS からのダウンロード
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>());