GridFS は BSON ドキュメント サイズ の制限である16 MB を超えるファイルを保存および取得するための仕様です。 GridFS は単一ドキュメントに大きなファイルを保存する代わりに、チャンクと呼ばれる複数の部分にファイルを分割してから各チャンクを別々のドキュメントとして保存します。
GridFS ストアでファイルをクエリすると、ドライバーは必要に応じてチャンクを再アセンブルします。
このガイドのコード例は、GridFSTour.scala から取得されています。ドライバーソースコードGithubリポジトリ内のファイル。
前提条件
このガイドのコード例を実行するには、プログラムに次のインポート ステートメントを含める必要があります。
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()