Menu Docs
Página inicial do Docs
/ / /
Driver Scala
/

Armazene arquivos grandes usando o GridFS

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 arquivo GridFSTour.scala no repositório do Github de código-fonte do driver.

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.

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 .

O GridFS armazena arquivos em duas collections:

  • chunks: armazena os blocos de arquivo

  • files: 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.

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

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

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

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.

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

Voltar

Atlas Searchgeoespacial

Nesta página