MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Armazenando arquivos no MongoDB com GridFS

Muitos aplicativos envolvem gerenciamento de arquivos e têm armazenamento de arquivos como um recurso importante para aprimorar o processamento de dados. O armazenamento de arquivos geralmente requer um CDN (Content Delivery Network) de terceiros, como o Amazon Web Services, mas isso torna o processo de gerenciamento um pouco tedioso. Seria mais fácil acessar todos os seus recursos de um único armazenamento em nuvem, em vez de vários, pois pode haver uma chance de falha durante a recuperação.

Armazenar arquivos diretamente em um banco de dados por meio de uma única chamada de API não era algo fácil até a introdução do GridFS no MongoDB.

O que é MongoDB GridFS

GridFs é uma camada de abstração no MongoDB usada no armazenamento e recuperação de arquivos grandes como vídeos, áudios e imagens. Esse sistema de arquivos armazena arquivos que são ainda mais significativos do que 16 MB nas coleções de dados do MongoDB. Os arquivos são armazenados primeiro dividindo-os em partes menores de dados, cada parte com um tamanho de 255 KB.

GridFS usa dois sistemas de coleta para armazenar arquivos:

  1. Pedaço :Esta é a coleção que armazena as partes do documento. Os pedaços são limitados a um tamanho de 255 KB cada e quando se faz uma consulta, o driver GridFS remonta todos os pedaços de acordo com o _id exclusivo do armazenamento. Por exemplo, você pode querer recuperar um segmento de um arquivo de vídeo em vez do arquivo inteiro, isso é possível apenas consultando o intervalo correto desejado.
  2. Arquivo :armazena os metadados adicionais consequentes para o arquivo.

As coleções são colocadas em um bucket comum e, em seguida, prefixam cada um com o nome do bucket que por padrão é fs e, portanto, temos:

  • fs.chunks
  • fs.files

Pode-se escolher um nome de bucket diferente, mas o nome completo da coleção está sujeito a:limite de espaço de nomes de 255 bytes.

Coleção de pedaços

Os documentos de coleção de fragmentos têm o formato:

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Onde:

  • _id:é o identificador exclusivo do bloco
  • files_id:é o _id do documento pai conforme armazenado na coleção de arquivos
  • n:é o número de sequência do bloco começando com 0.
  • dados:é a carga útil do bloco como tipo binário BSON.

Um índice composto usando files_id e n campos é usado para permitir a recuperação eficiente de pedaços, por exemplo:

db.fs.chunks.find( { files_id: fileId } ).sort( { n: 1 } )

Para criar este índice, caso ele não exista, você pode executar o seguinte comando em um shell mongo:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

Coleção de arquivos

Os documentos nesta coleção têm o formato

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Onde:

  •  _id:é o identificador exclusivo do documento que é do tipo de dados escolhido para o documento original e, por padrão, no MongoDB é o BSON ObjectId.
  • comprimento:é o tamanho do documento em bytes
  • chunkSize:tamanho de cada pedaço limitado a 255 kilobytes
  • uploadDate:campo do tipo Data que armazena a data em que o documento foi armazenado pela primeira vez.
  • nome do arquivo:este é um campo opcional que é uma identificação legível para o arquivo.
  • metadados:este é um campo opcional que contém informações adicionais que se deseja armazenar.

Um exemplo de um arquivo fs é mostrado abaixo.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

   "uploadDate": ISODate("2020-08-11T10:02:15.237Z"),

   "length": NumberInt(312)

}

Assim como a coleção de chunks, um índice composto usando os campos filename e uploadDate é usado na coleção de arquivos para permitir a recuperação eficiente de arquivos, por exemplo:
db.fs.files.find( { filename: fileName } ).sort( { uploadDate: 1 } )

Para criar este índice, caso ele não exista, você pode executar o seguinte comando em um shell mongo:

db.fs.file.createIndex( { filename: 1, uploadDate: 1 }, { unique: true } );

Quando usar o sistema de armazenamento MongoDB GridFS

MongoDB GridFS não é comumente usado, mas a seguir estão as condições que podem exigir o uso deste sistema de armazenamento GridFS;

  •  Quando o sistema de arquivos atual tem um limite no número de arquivos que podem ser armazenados em um determinado diretório.
  •  Quando se pretende acessar parte das informações armazenadas, o GridFS permite recuperar partes do arquivo sem acessar todo o documento.
  • Quando se pretende distribuir arquivos e seus metadados por meio de conjuntos de réplicas distribuídos geograficamente, o GridFS permite que os metadados sincronizem e implantem os dados em vários sistemas de destino automaticamente.

Quando não usar o sistema de armazenamento MongoDB GridFS

No entanto, o sistema de armazenamento GridFS não é apropriado para uso quando houver necessidade de atualizar o conteúdo de todo o arquivo salvo no GridFS.

Como adicionar arquivos ao GridFS

Ao armazenar um arquivo mp3 no MongoDB usando GridFs, o procedimento correto a seguir é este;

  1. Abra o terminal (o prompt de comando)
  2. Navegue até o mongofiles.exe (localizado na pasta bin)
  3. Use o comando 
    >mongofiles.exe -d gridfs put song.mp3

Após o comando, o nome do banco de dados a ser utilizado é o gridfs, se por acaso o nome estiver faltando, o MongoDB cria automaticamente um documento que armazena o arquivo no banco de dados.

Para visualizar o arquivo armazenado no GridFS, use o comando query abaixo no shell do mongo;

>db.fs.files.find()

O comando retorna um documento com o formato mostrado abaixo:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",

   length: 10302960

}

O arquivo tem os seguintes detalhes, nome do arquivo,  comprimento, data de upload, tamanho do bloco  e object_id. Os pedaços na coleção fs.chunks podem ser visualizados usando o id retornado na consulta inicial, conforme mostrado abaixo.

>db.fs.chunks.find({files_id:ObjectId('526a922bf8b4aa4d33fdf84d')})

Fragmentação do GridFS

Sharding também é outro recurso aplicável com GridFS. Para fragmentar a coleção de fragmentos, pode-se usar um índice composto de { files_id :1, n :1 } ou { files_id :1 } como a chave de fragmentação.

Harshed Sharding só é possível se os drivers do MongoDB não rodarem filemd5.

As coleções de arquivos geralmente não são fragmentadas porque contêm apenas metadados e são muito pequenas. As chaves disponíveis também não fornecem uma distribuição uniforme em um cluster fragmentado. No entanto, se for necessário fragmentar uma coleção de arquivos, você pode usar o campo _id em combinação com alguns campos do aplicativo.

Limitações do GridFS

O sistema de arquivos GridFS tem as seguintes limitações:

  1. Atualização atômica: O GridFS não possui uma atualização atômica. Isso facilita a atualização manual escolhendo a versão necessária dos arquivos e mantendo várias versões dos arquivos em execução
  2. Desempenho : o sistema tende a ser lento com o sistema de arquivos e o servidor da Web.
  3. Conjunto de trabalho: um usa outro servidor ao trabalhar em um novo conjunto de trabalho. Isso é feito para evitar perturbar o conjunto de trabalho em execução.

Conclusão


GridFS é como uma bala de prata para desenvolvedores que pretendem armazenar arquivos grandes no MongoDB. O sistema de armazenamento GridFS oferece aos desenvolvedores a chance de armazenar arquivos grandes e recuperar partes dos arquivos necessários. O GridFS é, portanto, um excelente recurso do MongoDB que pode ser usado com vários aplicativos.