Menu Docs
Página inicial do Docs
/ /

Armazene arquivos grandes usando o GridFS

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 Ruby 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 collections fs.chunks e fs.files, a menos que você especifique um nome diferente nas opções de método Mongo::Database#fs. 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 um representado 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 fazer upload do arquivo da memória ou de um stream. O diagrama a seguir mostra como o GridFS divide os arquivos quando eles são 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 método fs em uma instância do Mongo::Database. Você pode usar a instância FSBucket para executar operações de leitura e gravação nos arquivos do seu bucket.

bucket = database.fs

Para criar ou referenciar um contêiner com um nome diferente do nome padrão fs, passe o nome do contêiner como um parâmetro opcional para o método fs, como mostrado no exemplo a seguir:

custom_bucket = database.fs(database, bucket_name: 'files')

O método upload_from_stream lê o conteúdo de um fluxo de upload e o salva na instância GridFSBucket.

Você pode passar um Hash como um parâmetro opcional para configurar o tamanho do bloco ou incluir metadados adicionais.

O exemplo a seguir carrega um arquivo no FSBucket e especifica metadados para o arquivo carregado:

metadata = { uploaded_by: 'username' }
File.open('/path/to/file', 'rb') do |file|
file_id = bucket.upload_from_stream('test.txt', file, metadata: metadata)
puts "Uploaded file with ID: #{file_id}"
end

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 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 FSBucket. O seguinte exemplo de código recupera e imprime metadados de arquivo de todos os arquivos em um bucket GridFS :

bucket.find.each do |file|
puts "Filename: #{file.filename}"
end

Para saber mais sobre como fazer query no MongoDB, consulte Encontrar documentos.

O método download_to_stream baixa o conteúdo de um arquivo.

Para baixar um arquivo pelo seu arquivo _id, passe o _id para o método. O método download_to_stream escreve o conteúdo do arquivo no objeto fornecido. O exemplo a seguir baixa um arquivo pelo arquivo _id:

file_id = BSON::ObjectId('your_file_id')
File.open('/path/to/downloaded_file', 'wb') do |file|
bucket.download_to_stream(file_id, file)
end

Se você nomear um arquivo, mas não seu _id, você poderá usar o método download_to_stream_by_name. O exemplo a seguir baixa um arquivo chamado mongodb-tutorial:

File.open('/path/to/downloaded_file', 'wb') do |file|
bucket.download_to_stream_by_name('mongodb-tutorial', file)
end

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

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:

file_id = BSON::ObjectId('your_file_id')
bucket.delete(file_id)

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

Configurar operações CRUD

Nesta página