GridFS e MongoDB…
Vivemos uma tempestade de dados! É normal termos dados em muitos formatos, em muitos tamanhos, sendo gerados em uma velocidade estonteante. O MongoDB é muito bom para manipular dados semiestruturados (principalmente documentos no formato JSON), e estes devem ter o tamanho máximo de 16MB.
Nesta situação você pode estar achando o MongoDB muito limitado, afinal um documento pode ter mais de 16MB. E Nesta situação, o que você fará com ele? E nos cenários onde você deseja armazenar, por exemplo uma foto, como proceder?
Se você precisa armazenar arquivos e documentos grandes (entenda documentos grandes como aqueles com mais de 16MB) no MongoDB, você precisa conhecer o GridFS.
GridFS
Formalmente falando, o GridFS é uma especificação para armazenar e recuperar arquivos que excedem o limite de tamanho do documento BSON de 16 MB.
Em vez de armazenar um arquivo em um único documento, GridFS divide o arquivo em partes , e armazena cada parte como um documento separado. Por padrão o GridFS divide um arquivo em partes de 255 kB, com exceção do último pedaço, que é tão grande quanto necessário. Da mesma forma, os arquivos que não são maiores do que o tamanho do bloco só têm um pedaço final, usando apenas o espaço necessário, além de alguns metadados adicionais.
Em algumas situações, armazenar arquivos no MongoDB pode ser mais eficiente do que em um sistema de arquivos. Use o GridFS:
- Se o seu sistema de arquivos limita o número de arquivos em um diretório, você pode usar GridFS para armazenar tantos arquivos quanto necessário
- Quando você deseja manter seus arquivos e metadados automaticamente sincronizados e implantados em vários sistemas, você pode usar GridFS. Ao usar conjuntos de réplicas distribuídos geograficamente, o MongoDB pode distribuir arquivos e seus metadados automaticamente para várias instâncias e instalações de mongod.
O GridFS é um recurso bacaninha, mas tenha em mente que ele não é super veloz (e eu acho que é previsto que não seja, certo?) e se seus arquivos forem menores que 16 MB, considere armazenar o arquivo manualmente em um único documento em vez de usar GridFS.
Algumas informações importantes
- Para incluir arquivos usando o GridFS, usamos o utilitário mongofiles.
- mongofiles <options> <commands> <filename>
- Saiba mais sobre ele em https://docs.mongodb.com/v3.4/reference/program/mongofiles/
- Caso o arquivo carregado possua mais que 16 MB, internamente ele será dividido em partes que chamamos de chunks.
- No banco de dados onde salvaremos os arquivos serão criadas duas coleções: fs.files e fs.chunks. A primeira terá um documento para cada arquivo importado, enquanto que a segunda comportará a relação de chunks.
- As duas coleções são relacionadas. Um arquivo possui diversos chunks. Ou seja, o _id da coleção fs.files existe na coleção fs.chunks (atributo files_id).
Inclusão de Arquivos
Para incluir um arquivo no MongoDB usamos o comando put do utilitário mongofiles.
Este comando faz um cópia do arquivo do sistema de arquivos para o MongoDB.
Por exemplo:
mongofiles –host localhost –db DB4B put C:\Users\danie\Artigo.docx
Onde:
- –host = Servidor
- –db = Banco de dados
- put = comando que indica a inclusão do arquivo
- Artigo.docx = nome do arquivo
Consulta de Arquivos
Para listar todos os arquivos armazenados no banco de dados:
mongofiles –host localhost –db DB4B list
Para localizar um arquivo que possua em seu nome uma determinada string, podemos usar o comando search, cuja sintaxe é:
mongofiles –host localhost –db DB4B search Art
Exclusão de Arquivos
A exclusão também é bem simples:
mongofiles –host localhost –db DB4B delete C:\Users\danie\Artigo.docx
Conclusão
Estamos acabando 2017… Abordamos muitos tópicos do MongoDB, alguns (como este) bem avançados. Mas eu acredito que é importante você conhecer os recursos disponíveis, e utiliza-los mostrando o profissional de sucesso que você é!
Se você tem alguma dúvida, é só me procurar no Twitter, ou no facebook, ou comentando este post, ou no formulário de contato. Não se preocupe… Eu sempre respondo (mesmo que seja para avisar que estou pesquisando).
Referências