GridFS é uma especificação para armazenar e recuperar arquivos que excedem o BSON- limite de tamanho de documento de 16 MiB.
Observação
O GridFS não é compatível com transações multidocumento.
Em vez de armazenar um arquivo em um único documento, o GridFS divide o arquivo em partes, ou chunks [], e armazena cada chunk como um documento separado . Por padrão, o GridFS usa um tamanho de bloco padrão 1de 255 KB; ou seja, o GridFS divide um arquivo em blocos de 255 KB com exceção do último bloco. O último pedaço é tão grande quanto necessário. Da mesma forma, os arquivos que não são maiores do que o tamanho do bloco têm apenas um bloco final, usando apenas o espaço necessário mais alguns metadados adicionais.
GridFS usa duas coleções para armazenar arquivos. Uma coleção armazena as partes de arquivo e os outros armazenam metadados de arquivo. A seção Coleções do GridFS descreve cada coleção em detalhes.
Ao queryr o GridFS para um arquivo, o driver reagrupará os blocos conforme necessário. Você pode realizar queries de intervalo em arquivos armazenados por meio do GridFS. Também é possível acessar informações de seções arbitrárias de arquivos, como para "pular" para o meio de um arquivo de vídeo ou áudio.
O GridFS é útil não apenas para armazenar arquivos que excedem 16 MiB, mas também para armazenar quaisquer arquivos aos quais você deseja acesso sem precisar carregar o arquivo inteiro na memória. Consulte também Quando usar o GridFS.
Quando usar o GridFS
No MongoDB, use GridFS para armazenar arquivos maiores que 16 MiB.
Em algumas situações, o armazenamento de arquivos grandes pode ser mais eficiente em um Banco de dados MongoDB do que em um sistema de arquivos no nível do sistema.
Se o seu sistema de arquivos limitar o número de arquivos em um diretório, você poderá usar o GridFS para armazenar quantos arquivos forem necessários.
Quando você deseja acessar informações de partes grandes arquivos sem ter que carregar arquivos inteiros na memória, você pode usar GridFS para recuperar seções de arquivos sem ler o arquivo inteiro na memória.
Quando quiser manter seus arquivos e metadados automaticamente sincronizados e implantados em vários sistemas e instalações, você pode usar o GridFS. Ao utilizar conjuntos de réplica distribuídos geograficamente, o MongoDB pode distribuir arquivos e seus metadados automaticamente para uma série de instâncias e instalações do
mongod.
Não use o GridFS se precisar atualizar o conteúdo do arquivo inteiro atomicamente. Como alternativa, você pode armazenar múltiplas versões de cada arquivo e especificar a versão atual do arquivo nos metadados. Você pode atualizar o campo de metadados que indica o status "mais recente" em uma Atualização atômica após carregar a nova versão do arquivo e posterior remova versões anteriores, se necessário.
Além disso, se todos os seus arquivos forem menores que o 16 limite de tamanho do documento MiB BSON, considere armazenar cada arquivo em um único documento em vez de usar o GridFS. Você pode utilizar o tipo de dados BinData para armazenar os dados binários. Consulte a documentação de seus drivers para obter detalhes sobre o uso do BinData.
Usar GridFS
Para armazenar e recuperar arquivos usando o GridFS, use uma das seguintes opções:
Um driver do MongoDB. Consulte a documentação dos drivers para obter informações sobre como usar o GridFS com seu driver.
A ferramenta de linha de comando
mongofiles. Consulte a referênciamongofilespara documentação.
Collections do GridFS
O GridFS armazena arquivos em duas collections:
chunksarmazena as partes binárias. Para obter detalhes, consulte A coleçãochunks.filesarmazena os metadados do arquivo. Para obter detalhes, consulte Afilescoleção.
O GridFS coloca as collections em um bucket comum, prefixando cada uma com o nome do bucket. Por padrão, o GridFS usa duas coleções com um bucket chamado fs:
fs.filesfs.chunks
Você pode escolher um nome de contêiner diferente, como também, criar múltiplos blocos em um único banco de dados. O nome completo da collection, que inclui o nome do bucket, está sujeito ao limite de comprimento do namespace.
Coleção chunks
Cada documento na collection chunks [1] representa um chunk distinto de um arquivo como representado no GridFS. Os documentos nesta collection têm o seguinte formulário:
{ "_id" : <ObjectId>, "files_id" : <ObjectId>, "n" : <num>, "data" : <binary> }
Um documento da collection chunks contém os seguintes campos:
chunks._idO ObjectId exclusivo do chunk.
chunks.dataA carga útil do chunk como um tipo BSON
Binary.
Coleção files
Cada documento na collection files representa um arquivo no GridFS.
{ "_id" : <ObjectId>, "length" : <num>, "chunkSize" : <num>, "uploadDate" : <timestamp>, "md5" : <hash>, "filename" : <string>, "contentType" : <string>, "aliases" : <string array>, "metadata" : <any>, }
Os documentos na collection files contêm alguns ou todos os seguintes campos:
files._idO identificador exclusivo deste documento. O
_idé do tipo de dados que você escolheu para o documento original. O tipo padrão para documentos MongoDB é BSON ObjectId.
files.chunkSizeO tamanho de cada chunk em bytes. GridFS divide o documento em blocos de
chunkSizetamanho, exceto o último, que é tão grande quanto necessário. O tamanho padrão é 255 kibibytes (KiB).
files.uploadDateA data em que o documento foi armazenado pela primeira vez pelo GridFS. Este valor tem o tipo
Date.
files.md5Obsoleto(a)
O algoritmo MD5 é proibido por FIPS 140-2. Os drivers do MongoDB eliminam o suporte ao MD5 e removerão a geração de MD5 em versões futuras. Os aplicativos que exigem um resumo de arquivo devem implementá-lo fora do GridFS e armazená-lo em
files.metadata.Um hash MD5 do arquivo completo retornado pelo comando filemd5. Este valor tem o tipo
String.
files.contentTypeObsoleto(a)
Opcional. Um tipo de MIME válido para o arquivo GridFS. Somente para uso do aplicativo.
Utilize o
files.metadatapara armazenar informações relacionadas ao tipo MIME do arquivo GridFS.
files.aliasesObsoleto(a)
Opcional. Uma array de strings de alias. Apenas para uso do aplicativo.
Utilize o
files.metadatapara armazenar informações relacionadas ao tipo MIME do arquivo GridFS.
GridFS Indexes
O GridFS usa índices em cada uma das coletas chunks e files para maior eficiência. Os drivers que estão em conformidade com a especificação do GridFS criam automaticamente esses índices por conveniência. Você também pode criar quaisquer índices adicionais, conforme desejado, para atender às necessidades do seu aplicativo.
Índice chunks
O GridFS usa um índice composto exclusivo na collection chunks usando os campos files_id e n. Isso permite a recuperação eficiente de chunks, conforme demonstrado no exemplo a seguir:
db.fs.chunks.find( { files_id: myFileID } ).sort( { n: 1 } )
Os drivers que estiverem em conformidade com a especificação do GridFS garantirão automaticamente que esse índice exista antes das operações de leitura e gravação. Consulte a documentação relevante do driver para saber o comportamento específico do seu aplicação GridFS .
Se esse índice não existir, você poderá emitir a seguinte operação para criá-lo utilizando mongosh:
db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );
Índice files
O GridFS utiliza um índice na collection files utilizando os campos filename e uploadDate. Esse índice permite a recuperação eficiente de arquivos, como mostrado neste exemplo:
db.fs.files.find( { filename: myFileName } ).sort( { uploadDate: 1 } )
Os drivers que estiverem em conformidade com a especificação do GridFS garantirão automaticamente que esse índice exista antes das operações de leitura e gravação. Consulte a documentação relevante do driver para saber o comportamento específico do seu aplicação GridFS .
Se esse índice não existir, você poderá emitir a seguinte operação para criá-lo utilizando mongosh:
db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );
| [1] | (1, 2) O uso do termo chunk no contexto do GridFS não está relacionado ao uso do termo chunk no contexto da fragmentação. |
Fragmentação do GridFS
Existem duas collections a considerar com o GridFS - files e chunks.
chunks collection
Para fragmentar a coleta chunks, utilize { files_id : 1, n : 1
} ou { files_id : 1 } como o índice da chave de fragmento. files_id é um ObjectId e altera monotonicamente.
Para drivers do MongoDB que não executam filemd5 para verificar o carregamento bem-sucedido, você pode usar a fragmentação hasheada para a coleção chunks.
Se o driver do MongoDB executar o filemd5, você não poderá usar a Fragmentação com hash. Para obter maiores detalhes, consulte SERVIDOR-9888.
files collection
A coleta files é pequena e contém somente metadados. Nenhuma das chaves necessárias para o GridFS se emprestam a uma distribuição uniforme em um ambiente fragmentado. Deixar files sem fragmentação permite que todos os documentos de metadados de arquivos residam em um fragmento.
Se você necessita fragmentar a collection files, use o campo _id, possivelmente em combinação com um campo do aplicativo.