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.
Instead of storing a file in a single document, GridFS divides the file into parts, or chunks [1], and stores each chunk as a separate document. By default, GridFS uses a chunk size of 255 KiB; that is, GridFS divides a file into chunks of 255 KiB with the exception of the last chunk. The last chunk is only as large as necessary. Similarly, files that are no larger than the chunk size only have a final chunk, using only as much space as needed plus some additional metadata.
GridFS usa duas collections para armazenar arquivos. Uma coleção armazena as partes de arquivo e os outros armazenam metadados de arquivo.
Quando você query o GridFS para um arquivo, o driver reagrupa as partes conforme necessário. Você pode realizar queries de faixa 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 só para armazenar arquivos que excedem 16 MiB, mas também para armazenar quaisquer arquivos que você queira acessar sem ter que 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.
If your files are all smaller than the 16 MiB BSON Document Size limit, consider storing each file in a single document instead of using GridFS. Use the BinData data type to store the binary data. See your drivers documentation for details on using 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.
The
mongofilescommand-line tool. See themongofilesreference for documentation.
Collections do GridFS
O GridFS armazena arquivos em duas collections:
chunksstores the binary chunks. For details, see ThechunksCollection.filesstores the file's metadata. For details, see ThefilesCollection.
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
Each document in the chunks [1] collection represents a distinct chunk of a file as represented in GridFS. Documents in this collection have the following form:
{ "_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 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)
The MD5 algorithm is prohibited by FIPS 140-2. MongoDB drivers deprecate MD5 support and will remove MD5 generation in future releases. Applications that require a file digest should implement it outside of GridFS and store in
files.metadata.Um hash MD5 do arquivo completo retornado pelo comando
filemd5. Este valor tem o tipoString.
files.contentTypeObsoleto(a)
Opcional. Um tipo de MIME válido para o arquivo GridFS. Somente para uso do aplicativo.
Use
files.metadatafor storing information related to the MIME type of the GridFS file.
files.aliasesObsoleto(a)
Opcional. Uma array de strings de alias. Apenas para uso do aplicativo.
Use
files.metadatafor storing alias information.
GridFS Indexes
O GridFS usa índices em cada uma das coleções chunks e files para obter 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 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 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 .
If this index does not exist, you can issue the following operation to create it using 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 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 .
If this index does not exist, you can issue the following operation to create it using mongosh:
db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );
| [1] | (1, 2) The use of the term chunks in the context of GridFS is not related to the use of the term chunks in the context of sharding. |
Fragmentação do GridFS
O GridFS tem duas coleções a considerar: 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 no fragmento primário.
Se você necessita fragmentar a collection files, use o campo _id, possivelmente em combinação com um campo do aplicativo.