GridFS para implantações autogerenciadas
Nesta página
GridFS é uma especificação para armazenar e recuperar arquivos que excedem o limite de tamanhodo documento BSON de 16 MB.
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 [1], e armazena cada chunk como um documento separado. Por padrão, o GridFS usa um tamanho de bloco padrão de 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 só para armazenar arquivos que excedem 16 MB, 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
No MongoDB, use GridFS para armazenar arquivos maiores que 16 MB.
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 limite de 16 MB do tamanho do documento 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 maiores 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ênciamongofiles
para documentação.
Collections do GridFS
O GridFS armazena arquivos em duas collections:
chunks
armazena as partes binárias. Para obter detalhes, consulte A coleçãochunks
.files
armazena os metadados do arquivo. Para obter detalhes, consulte Afiles
coleçã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.files
fs.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._id
O ObjectId exclusivo do chunk.
chunks.data
A 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._id
O 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.chunkSize
O tamanho de cada chunk 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 é de 255 kilobytes (kB).
files.uploadDate
A data em que o documento foi armazenado pela primeira vez pelo GridFS. Este valor tem o tipo
Date
.
files.md5
Obsoleto(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.contentType
Obsoleto(a)
Opcional. Um tipo de MIME válido para o arquivo GridFS. Somente para uso do aplicativo.
Utilize o
files.metadata
para armazenar informações relacionadas ao tipo MIME do arquivo GridFS.
files.aliases
Obsoleto(a)
Opcional. Uma array de strings de alias. Apenas para uso do aplicativo.
Utilize o
files.metadata
para armazenar informações relacionadas ao tipo MIME do arquivo GridFS.
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 GridFS criam automaticamente esses índices por questão de 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 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 aplicativo 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 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 aplicativo 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 no fragmento primário.
Se você necessita fragmentar a collection files
, use o campo _id
, possivelmente em combinação com um campo do aplicativo.