GridFS é a especificação MongoDB para armazenar e recuperar arquivos grandes como imagens, arquivos de áudio, arquivos de vídeo, etc. É uma espécie de sistema de arquivo para armazenar arquivos, mas seus dados são armazenados dentro das coleções do MongoDB. GridFS tem a capacidade de armazenar arquivos ainda maiores que seu limite de tamanho de documento de 16MB.
GridFS divide um arquivo em pedaços e armazena cada pedaço de dados em um documento separado, cada um de tamanho máximo 255k.
GridFS por padrão usa duas coleções fs.files e fs.chunks para armazenar os metadados do arquivo e os pedaços. Cada pedaço é identificado pelo seu campo exclusivo _id ObjectId. O arquivo fs.files serve como um documento pai. O campo files_id no documento fs.chunks liga o pedaço ao seu documento pai.
Following é um documento de amostra da colecçã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 ficheiro, tamanho do pedaço, data do upload e comprimento.
Following é 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 comando put. Para isso, usaremos o utilitário mongofiles.exe presente na pasta bin da pasta de instalação do MongoDB.
Abra o prompt de comando, navegue até o 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 da base de dados na qual o arquivo será armazenado. Se a base de dados não estiver presente, o MongoDB criará automaticamente um novo documento no momento. Song.mp3 é o nome do arquivo carregado. Para ver o documento do arquivo na base de dados, você pode usar o comando 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 }
Nós também podemos ver todos os pedaços presentes em fs.A coleção de pedaços relacionados ao arquivo armazenado com o seguinte código, 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 significando que todo o documento mp3 foi dividido em 40 pedaços de dados.