Armazene arquivos grandes usando o GridFS
Nesta página
Visão geral
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.
Como funciona o GridFS
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.
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.
Crie um intervalo GridFS
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")
Fazer upload de arquivos
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}")
Recuperar informações do arquivo
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 arquivoO 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.
Baixar arquivos
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
).
Renomear arquivos
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()
.
Excluir arquivos
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()
.
Documentação da API
Para saber mais sobre como usar o GridFS para armazenar e recuperar arquivos grandes, consulte a seguinte documentação da API: