O GridFS funciona armazenando vários pedaços para cada arquivo. Dessa forma, você pode entregar e armazenar arquivos muito grandes sem precisar armazenar o arquivo inteiro na RAM. Além disso, isso permite armazenar arquivos maiores que o tamanho máximo do documento. O tamanho de bloco recomendado é 256kb.
O campo de metadados de arquivo pode ser usado para armazenar metadados específicos de arquivo adicionais, que podem ser mais eficientes do que armazenar os metadados em um documento separado. Isso depende muito de seus requisitos exatos, mas o campo de metadados, em geral, oferece muita flexibilidade. Tenha em mente que alguns dos metadados mais óbvios já fazem parte do
fs.files
documento, por padrão:> db.fs.files.findOne();
{
"_id" : ObjectId("4f9d4172b2ceac15506445e1"),
"filename" : "2e117dc7f5ba434c90be29c767426c29",
"length" : 486912,
"chunkSize" : 262144,
"uploadDate" : ISODate("2011-10-18T09:05:54.851Z"),
"md5" : "4f31970165766913fdece5417f7fa4a8",
"contentType" : "application/pdf"
}
Para realmente ler o arquivo do GridFS, você terá que buscar o documento do arquivo em
fs.files
e os pedaços de fs.chunks
. A maneira mais eficiente de fazer isso é transmitir isso para o cliente pedaço por pedaço, para que você não precise carregar o arquivo inteiro na RAM. Os chunks
coleção tem a seguinte estrutura:> db.fs.chunks.findOne({}, {"data" :0});
{
"_id" : ObjectId("4e9d4172b2ceac15506445e1"),
"files_id" : ObjectId("4f9d4172b2ceac15506445e1"),
"n" : 0, // this is the 0th chunk of the file
"data" : /* loads of data */
}
Se você quiser usar os
metadata
campo de fs.files
para suas consultas, certifique-se de entender a notação de ponto, por exemplo > db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
também certifique-se de que suas consultas podem usar um índice usando
explain()
.