Docs Menu
Docs Home
/ / /
Scala
/

GridFS

項目一覧

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

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

val mongoClient: MongoClient = MongoClient()

MongoDB 配置への接続の詳細については、「 MongoDB への接続」ガイドを参照してください。

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バケットにデータをアップロードすると、 コレクションと コレクションにインデックスが自動的に作成されます。

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()

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}"))

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()

戻る

地理空間検索