GridFS
Nesta página
GridFS é uma especificação para armazenar e recuperar arquivos que excedem o limite de tamanho do documento BSON de 16 MB. Em vez de armazenar um arquivo grande em um único documento, o GridFS divide um arquivo em partes, ou chunks, e armazena cada um desses chunks como documentos separados.
Quando você consulta um armazenamento GridFS para um arquivo, o driver reagrupa os blocos conforme necessário.
Os exemplos de código neste guia vêm do GridFSTour.scalano Github repositório do do código fonte do driver.
Pré-requisitos
Você deve incluir as seguintes declarações de importação em seu programa para executar os exemplos de código neste guia:
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
Observação
Este guia usa as implicações implícitas de Observable
, conforme abordadas no Quick Start Primary.
Conecte-se a um MongoDB deployment
Primeiro, conecte-se a um MongoDB deployment e declare e defina uma instância MongoDatabase
.
O código a seguir se conecta a uma MongoDB deployment standalone em execução em localhost
na porta 27017
:
val mongoClient: MongoClient = MongoClient()
Para saber mais sobre como se conectar a sistemas do MongoDB, consulte o guia Conectar ao MongoDB .
Crie um intervalo GridFS
O GridFS armazena arquivos em duas collections:
chunks
: armazena os blocos de arquivofiles
: armazena metadados do arquivo
As duas collections estão em um bucket comum e os nomes das collections são prefixados com o nome do bucket.
O driver fornece o método GridFSBucket()
para criar instâncias GridFSBucket
:
val myDatabase = mongoClient.getDatabase("mydb") // Create a gridFSBucket using the default bucket name "fs" val gridFSBucket = GridFSBucket(myDatabase)
Você pode passar um nome de bucket para o método GridFSBucket()
:
// Create a gridFSBucket with a custom bucket name "files" val gridFSFilesBucket = GridFSBucket(myDatabase, "files")
Observação
O GridFS cria automaticamente índices nas coleções files
e chunks
quando você carrega dados no contêiner GridFS.
Carregar no GridFS
O método GridFSBucket.uploadFromObservable()
lê o conteúdo de um Observable[ByteBuffer]
e o salva na instância GridFSBucket
.
Você pode usar o tipo GridFSUploadOptions
para configurar o tamanho do chunk ou incluir metadados adicionais.
O exemplo a seguir carrega o conteúdo de um Observable[ByteBuffer]
em 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()
Encontre arquivos armazenados no GridFS
Para localizar os arquivos armazenados no GridFSBucket
, use o método find()
.
O exemplo a seguir imprime o nome de cada arquivo armazenado:
gridFSBucket.find().results().foreach(file => println(s" - ${file.getFilename}"))
Você também pode fornecer um filtro personalizado para limitar os resultados retornados. O exemplo a seguir imprime os nomes de todos os arquivos em que o valor contentType
é um valor image/png
no documento de metadados definido pelo usuário:
gridFSBucket .find(Filters.equal("metadata.contentType", "image/png")) .results() .foreach(file => println(s" > ${file.getFilename}"))
Baixar do GridFS
O método downloadToObservable()
retorna um Observable[ByteBuffer]
que lê o conteúdo do MongoDB.
Para baixar um arquivo pelo _id
, passe o _id
para o método . O exemplo a seguir baixa um arquivo pelo arquivo _id
:
val downloadById = gridFSBucket.downloadToObservable(fileId).results()
Se você não souber o _id
do arquivo, mas souber o nome do arquivo, poderá passar o nome do arquivo para o método downloadToObservable()
. Por padrão, ele baixará a versão mais recente do arquivo. Utilize a classe GridFSDownloadOptions
para configurar qual versão baixar.
O exemplo a seguir baixa a versão original do arquivo chamado mongodb-tutorial
:
val downloadOptions: GridFSDownloadOptions = new GridFSDownloadOptions().revision(0) val downloadByName = gridFSBucket.downloadToObservable("mongodb-tutorial", downloadOptions).results()
Renomear arquivos
Se você precisar renomear um arquivo, use o método rename()
.
O exemplo a seguir renomeia um arquivo para mongodbTutorial
:
val fileId: ObjectId = ... // ObjectId of a file uploaded to GridFS gridFSBucket.rename(fileId, "mongodbTutorial").printResults()
Observação
O método rename()
exige um ObjectId
em vez de um filename
para garantir que o arquivo correto seja renomeado.
Para renomear várias revisões do mesmo nome de arquivo, primeiro recupere a lista completa de arquivos. Em seguida, para cada arquivo que deve ser renomeado, execute rename()
com o _id
correspondente.
Excluir arquivos
Para excluir um arquivo do GridFSBucket
, utilize o método delete()
.
O exemplo seguinte exclui um arquivo do GridFSBucket
:
val fileId: ObjectId = ... //ObjectId of a file uploaded to GridFS gridFSBucket.delete(fileId).printResults()