GridFS
項目一覧
GridFS は BSON ドキュメント サイズ の制限である16 MB を超えるファイルを保存および取得するための仕様です。 GridFS は単一ドキュメントに大きなファイルを保存する代わりに、チャンクと呼ばれる複数の部分にファイルを分割してから各チャンクを別々のドキュメントとして保存します。
GridFS ストアでファイルをクエリすると、ドライバーは必要に応じてチャンクを再アセンブルします。
このガイドのコード例は、ドライバーソースコードGitHubリポジトリの GridFSTour.scala ファイルから取得されています。
前提条件
このガイドのコード例を実行するには、プログラムに次のインポート ステートメントを含める必要があります。
import java.nio.ByteBuffer import java.nio.charset.StandardCharsets import org.mongodb.scala._ import org.mongodb.scala.bson.BsonObjectId import org.mongodb.scala.gridfs._ import org.mongodb.scala.model.Filters import tour.Helpers._ import scala.util.Success
注意
このガイドでは、 クイック スタート プライマリで説明されている Observable
の暗黙的な方法を使用します。
MongoDB 配置への接続
まず、MongoDB 配置に接続し、 MongoDatabase
インスタンスを宣言して定義します。
次のコードは、ポート27017
のlocalhost
で実行されているスタンドアロンの MongoDB 配置に接続します。
val mongoClient: MongoClient = MongoClient()
MongoDB 配置への接続の詳細については、「 MongoDB への接続」ガイドを参照してください。
GridFS バケットの作成
GridFS はファイルを次の 2 つのコレクションに保存します。
chunks
: ファイル チャンクを保存しますfiles
: stores file metadata
これら 2 つのコレクションは共通のバケット内にあり、コレクション名にはバケット名の前に付きます。
ドライバーは、 GridFSBucket
インスタンスを作成するためのGridFSBucket()
メソッドを提供します。
val myDatabase = mongoClient.getDatabase("mydb") // Create a gridFSBucket using the default bucket name "fs" val gridFSBucket = GridFSBucket(myDatabase)
バケット名をGridFSBucket()
メソッドに渡すことができます。
// Create a gridFSBucket with a custom bucket name "files" val gridFSFilesBucket = GridFSBucket(myDatabase, "files")
注意
GridFSfiles
chunks
バケットにデータをアップロードすると、 コレクションと コレクションにインデックスが自動的に作成されます。
GridFS へのアップロード
GridFSBucket.uploadFromObservable()
メソッドはObservable[ByteBuffer]
の内容を読み取り、 GridFSBucket
インスタンスに保存します。
GridFSUploadOptions
タイプを使用して、チャンク サイズを構成したり、追加のメタデータを含めたりできます。
次の例では、 Observable[ByteBuffer]
の内容をGridFSBucket
にアップロードします。
// Get the input stream val observableToUploadFrom: Observable[ByteBuffer] = Observable( Seq(ByteBuffer.wrap("MongoDB Tutorial".getBytes(StandardCharsets.UTF_8))) ) // Create some custom options val options: GridFSUploadOptions = new GridFSUploadOptions() .chunkSizeBytes(358400) .metadata(Document("type" -> "presentation")) val fileId: BsonObjectId = gridFSBucket .uploadFromObservable("mongodb-tutorial", observableToUploadFrom, options) .headResult()
GridFS に保存されているファイルの検索
GridFSBucket
に保存されているファイルを見つけるには、 find()
メソッドを使用します。
次の例では、保存されている各ファイルのファイル名を出力します。
gridFSBucket.find().results().foreach(file => println(s" - ${file.getFilename}"))
また、カスタム フィルターを提供して、返される結果を制限することもできます。 次の例では、ユーザー定義メタデータ ドキュメント内のcontentType
値がimage/png
値であるすべてのファイルのファイル名を出力します。
gridFSBucket .find(Filters.equal("metadata.contentType", "image/png")) .results() .foreach(file => println(s" > ${file.getFilename}"))
GridFS からのダウンロード
downloadToObservable()
メソッドは、MongoDB からコンテンツを読み取るObservable[ByteBuffer]
を返します。
ファイルをファイル_id
でダウンロードするには、 _id
を メソッドに渡します。 次の例では、ファイルを ファイル_id
でダウンロードします。
val downloadById = gridFSBucket.downloadToObservable(fileId).results()
ファイルの_id
がわからないがファイル名がわかっている場合は、ファイル名をdownloadToObservable()
メソッドに渡すことができます。 デフォルトでは、 ファイルの最新バージョンがダウンロードされます。 ダウンロードするバージョンを構成するには、 GridFSDownloadOptions
クラスを使用します。
次の例では、 mongodb-tutorial
という名前のファイルの元のバージョンをダウンロードします。
val downloadOptions: GridFSDownloadOptions = new GridFSDownloadOptions().revision(0) val downloadByName = gridFSBucket.downloadToObservable("mongodb-tutorial", downloadOptions).results()
ファイル名の変更
ファイルの名前を変更する必要がある場合は、 rename()
メソッドを使用します。
次の例では、ファイルの名前をmongodbTutorial
に変更します。
val fileId: ObjectId = ... // ObjectId of a file uploaded to GridFS gridFSBucket.rename(fileId, "mongodbTutorial").printResults()
注意
rename()
メソッドでは、正しいファイルの名前が変更されるように、 filename
ではなくObjectId
が必要です。
同じファイル名の複数のリビルドの名前を変更するには、まずファイルの完全なリストを検索します。 次に、名前を変更するファイルごとに、対応する_id
を使用してrename()
を実行します。
ファイルの削除
GridFSBucket
からファイルを削除するには、 delete()
メソッドを使用します。
次の例では、 GridFSBucket
からファイルを削除しています。
val fileId: ObjectId = ... //ObjectId of a file uploaded to GridFS gridFSBucket.delete(fileId).printResults()