文档菜单
文档首页
/ / /
Scala
/

GridFS

本页内容

  • 先决条件
  • 连接到 MongoDB 部署
  • 创建 GridFS 存储桶
  • 上传到 GridFS
  • 查找 GridFS 中存储的文件
  • 从 GridFS 下载
  • 重命名文件
  • 删除文件

GridFS 是一个用于存储和检索超出 16 MB BSON 文档大小限制的文件的规范。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 实例。

以下代码连接到一个在 localhost 上运行的独立MongoDB部署,端口号为 27017

val mongoClient: MongoClient = MongoClient()

要了解更多有关连接到MongoDB部署的信息,请参阅连接到MongoDB指南。

GridFS将文件存储在两个集合中

  • chunks:存储文件块

  • files:存储文件元数据

这两个集合位于同一个存储桶中,集合名称以存储桶名称为前缀。

驱动程序提供了 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")

注意

当您将数据上传到GridFS存储桶时,GridFS会自动在 fileschunks 集合上创建索引。

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() 方法返回一个 Observable[ByteBuffer],它从MongoDB读取内容。

要通过文件的 _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() 方法需要一个 ObjectId 而不是 filename,以确保正确重命名文件。

要重命名同一文件名的多个版本,首先检索所有文件的完整列表。然后,对于每个需要重命名的文件,使用相应的 _id 运行 rename()

要从 GridFSBucket 删除文件,请使用 delete() 方法。

以下示例从 GridFSBucket 删除文件

val fileId: ObjectId = ... //ObjectId of a file uploaded to GridFS
gridFSBucket.delete(fileId).printResults()

返回

地理空间搜索