MongoDB - GridFS

GridFSé a especificação do MongoDB para armazenar e recuperar arquivos grandes, como imagens, arquivos de áudio, arquivos de vídeo, etc. É uma espécie de sistema de arquivos para armazenar arquivos, mas seus dados são armazenados nas coleções do MongoDB. O GridFS tem a capacidade de armazenar arquivos ainda maiores do que seu limite de tamanho de documento de 16 MB.

GridFS divide um arquivo em blocos e armazena cada bloco de dados em um documento separado, cada um com tamanho máximo de 255k.

GridFS por padrão usa duas coleções fs.files e fs.chunkspara armazenar os metadados do arquivo e os pedaços. Cada pedaço é identificado por seu campo _id ObjectId exclusivo. O fs.files serve como um documento pai. ofiles_id campo no documento fs.chunks vincula o trecho a seu pai.

A seguir está um documento de amostra da coleção fs.files -

{
   "filename": "test.txt",
   "chunkSize": NumberInt(261120),
   "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
   "md5": "7b762939321e146569b07f72c62cca4f",
   "length": NumberInt(646)
}

O documento especifica o nome do arquivo, tamanho do bloco, data de upload e comprimento.

A seguir está um documento de amostra do documento fs.chunks -

{
   "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
   "n": NumberInt(0),
   "data": "Mongo Binary Data"
}

Adicionando Arquivos ao GridFS

Agora, vamos armazenar um arquivo mp3 usando GridFS usando o putcomando. Para isso, vamos usar omongofiles.exe utilitário presente na pasta bin da pasta de instalação do MongoDB.

Abra seu prompt de comando, navegue até mongofiles.exe na pasta bin da pasta de instalação do MongoDB e digite o seguinte código -

>mongofiles.exe -d gridfs put song.mp3

Aqui, gridfsé o nome do banco de dados no qual o arquivo será armazenado. Se o banco de dados não estiver presente, o MongoDB criará automaticamente um novo documento na hora. Song.mp3 é o nome do arquivo carregado. Para ver o documento do arquivo no banco de dados, você pode usar find query -

>db.fs.files.find()

O comando acima retornou o seguinte documento -

{
   _id: ObjectId('534a811bf8b4aa4d33fdf94d'), 
   filename: "song.mp3", 
   chunkSize: 261120, 
   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
   length: 10401959 
}

Também podemos ver todos os pedaços presentes na coleção fs.chunks relacionados ao arquivo armazenado com o código a seguir, usando o ID do documento retornado na consulta anterior -

>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})

No meu caso, a consulta retornou 40 documentos, o que significa que todo o documento mp3 foi dividido em 40 blocos de dados.