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

Armazene arquivos grandes usando o GridFS

Nesta página

  • Visão geral
  • Como funciona o GridFS
  • Crie um intervalo GridFS
  • Fazer upload de arquivos
  • Recuperar informações do arquivo
  • Baixar arquivos
  • Renomear arquivos
  • Excluir arquivos
  • Documentação da API

Neste guia, você pode aprender como armazenar e recuperar arquivos grandes no MongoDB usando GridFS. O GridFS é uma especificação que descreve como divisão os arquivos em blocos ao armazená-los e remontá-los ao recuperá-los. A implementação do driver Scala do GridFS é uma abstração que gerencia as operações e a organização do armazenamento de arquivos.

Use o GridFS se o tamanho dos seus arquivos exceder o limite de tamanho de documento BSON de 16MB. Para obter informações mais detalhadas sobre se o GridFS é adequado para seu caso de uso, consulte GridFS no manual do MongoDB Server .

As seções a seguir descrevem as operações do GridFS e como executá-las.

O GridFS organiza os arquivos em um bucket, um grupo de coleções do MongoDB que contém os blocos de arquivos e as informações que os descrevem. O bloco contém as seguintes coleções, nomeadas usando a convenção definida na especificação do GridFS:

  • A coleção chunks armazena os blocos de arquivo binário.

  • A coleção files armazena os metadados do arquivo.

Quando você cria um novo bloco GridFS , o driver cria as fs.chunks fs.files coleções e, a menos que você especifique um nome diferente no GridFSBucket() construtor. O driver também cria um índice em cada coleção para garantir a recuperação eficiente de arquivos e metadados relacionados. O driver cria o bucket GridFS , se ele não existir, somente quando a primeira operação de gravação for executada. O driver cria índices somente se eles não existirem e quando o bucket estiver vazio. Para obter mais informações sobre os índices do GridFS , consulte Índices do GridFS no manual do MongoDB Server .

Ao armazenar arquivos com GridFS, o driver divide os arquivos em partes menores, cada uma representada por um documento separado na coleção do chunks. Ele também cria um documento na coleção files que contém um ID de arquivo, nome de arquivo e outros metadados de arquivo. Você pode carregar o arquivo da memória ou de um stream. Confira o diagrama a seguir para ver como o GridFS divide os arquivos quando carregados em um bucket.

Um diagrama que mostra como o GridFS carrega um arquivo em um bloco

Ao recuperar arquivos, o GridFS obtém os metadados da coleção files no contêiner especificado e utiliza as informações para reconstruir o arquivo a partir de documentos na coleção chunks. Você pode ler o arquivo na memória ou enviá-lo para um fluxo.

Para armazenar ou recuperar arquivos do GridFS, crie um bucket do GridFS chamando o construtor GridFSBucket() e passando uma instância MongoDatabase . Pode utilizar a instância GridFSBucket para chamar operações de leitura e escrita nos ficheiros no seu bloco.

val bucket = GridFSBucket(database)

Para criar ou referenciar um contêiner com um nome personalizado diferente do nome padrão fs, passe seu nome de contêiner como o segundo parâmetro para o construtor GridFSBucket(), como mostrado no exemplo a seguir:

val filesBucket = GridFSBucket(database, "files")

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(
Seq(ByteBuffer.wrap("MongoDB Tutorial".getBytes(StandardCharsets.UTF_8)))
)
// Create some custom options
val options = new GridFSUploadOptions()
.chunkSizeBytes(358400)
.metadata(Document("type" -> "presentation"))
// Upload the file
val fileIdObservable = filesBucket.uploadFromObservable("mongodb-tutorial", observableToUploadFrom, options)
val fileId = Await.result(fileIdObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
println(s"File uploaded with id: ${fileId.toHexString}")

Nesta seção, você pode aprender como recuperar metadados de arquivo armazenados na coleção files do contêiner GridFS. Os metadados contêm informações sobre o arquivo a que se refere, incluindo:

  • O _id do arquivo

  • O nome do arquivo

  • O tamanho/comprimento do arquivo

  • A data e a hora do carregamento

  • Um documento metadata no qual você pode armazenar qualquer outra informação

Para saber mais sobre os campos que você pode recuperar da files collection, consulte a documentação da Collection de Arquivos GridFS no manual do MongoDB Server .

Para recuperar arquivos de um contêiner GridFS , chame o método find() na instância do GridFSBucket. O seguinte exemplo de código recupera e imprime metadados de arquivo de todos os arquivos em um bucket GridFS :

val filesObservable = filesBucket.find()
val results = Await.result(filesObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
results.foreach(file => println(s" - ${file.getFilename}"))

Para saber mais sobre como fazer queries no MongoDB, consulte Recuperar dados.

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 downloadObservable = filesBucket.downloadToObservable("<example file ID>")
val downloadById = Await.result(downloadObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

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(). O exemplo a seguir baixa um arquivo chamado mongodb-tutorial:

val downloadObservable = filesBucket.downloadToObservable("mongodb-tutorial")
val downloadById = Await.result(downloadObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

Observação

Se houver vários documentos com o mesmo valor de filename, o GridFS buscará o arquivo mais recente com o nome fornecido (conforme determinado pelo campo uploadDate).

Utilize o método rename() para atualizar o nome de um arquivo GridFS em seu bucket. Você deve especificar o arquivo para renomear pelo campo _id em vez do nome do arquivo.

O exemplo a seguir renomeia um arquivo para mongodbTutorial:

val renameObservable = filesBucket.rename("<example file ID>", "mongodbTutorial")
Await.result(renameObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

Observação

O método rename() aceita a atualização do nome de somente um arquivo por vez. Para renomear vários arquivos, recupere uma lista de arquivos correspondentes ao nome do arquivo do contêiner, extraia o campo _id dos arquivos que você deseja renomear e passe cada valor em chamadas separadas para o método rename() .

Use o método delete() para remover o documento de collection de um arquivo e os chunks associados do seu bucket. Você deve especificar o arquivo pelo campo _id em vez do nome do arquivo.

O exemplo a seguir exclui um arquivo por seu _id:

val deleteObservable = filesBucket.delete("<example file ID>")
Await.result(deleteObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

Observação

O método delete() suporta a exclusão de somente um arquivo de cada vez. Para excluir vários arquivos, recupere os arquivos do bucket, extraia o campo _id dos arquivos que deseja excluir e passe cada valor em chamadas separadas para o método delete() .

Para saber mais sobre como usar o GridFS para armazenar e recuperar arquivos grandes, consulte a seguinte documentação da API:

Voltar

Transações