GridFS é uma especificação para armazenar e recuperar arquivos que excedem o limite de tamanho do documento BSON 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 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 collections para armazenar arquivos. Uma coleção armazena as partes de arquivo e os outros armazenam metadados de arquivo.
Quando você consulta o GridFS para um arquivo, o driver reagrupa os blocos conforme necessário. Você pode realizar queries de intervalo em arquivos armazenados por meio do GridFS. Você também pode acessar informações de seções arbitrárias de arquivos, como "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
Use o 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ê quiser acessar partes de arquivos grandes sem carregar o arquivo inteiro na memória, use o GridFS.
Quando você quiser manter seus arquivos e metadados sincronizados e implantados em vários sistemas e instalações, use o GridFS. Com conjuntos de réplicas distribuídos geograficamente, o MongoDB distribui arquivos e seus metadados para
mongodinstâncias em diversas instalações.
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.
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. Use 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.
A chunks Collection
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.
A files Collection
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 parte em bytes. GridFS divide o documento em blocos de tamanho
chunkSize, 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.Um5 hash MD do arquivo completo retornado pelo comando. Este valor tem
filemd5oStringtipo.
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.
Use para armazenar informações de
files.metadataalias.
GridFS Indexes
O GridFS usa índices em cada uma das coletas chunks files e para maior eficiência. Os drivers que estão em conformidade com a especificação do GridFS criam automaticamente esses índices. Você também pode criar índices adicionais para atender ao seu aplicação.
O í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 estão em conformidade com a especificação do GridFS garantem 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 } );
O í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 estão em conformidade com a especificação do GridFS garantem 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
OGridFS tem duas collections a considerar: files chunkse.
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 para verificar o filemd5 carregamento bem-sucedido, você pode usar a fragmentação com hash para a chunks coleção.
Se o driver do MongoDB executar filemd5 o, você não poderá usar a fragmentação hasheada. Para obter detalhes, consulte SERVER-.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.