GridFS работи, като съхранява определен брой парчета за всеки файл. По този начин можете да доставяте и съхранявате много големи файлове, без да се налага да съхранявате целия файл в RAM. Освен това това ви позволява да съхранявате файлове, които са по-големи от максималния размер на документа. Препоръчителният размер на парчето е 256 kb.
Полето за метаданни на файла може да се използва за съхраняване на допълнителни специфични за файла метаданни, което може да бъде по-ефективно от съхраняването на метаданни в отделен документ. Това до голяма степен зависи от вашите точни изисквания, но полето с метаданни като цяло предлага много гъвкавост. Имайте предвид, че някои от по-очевидните метаданни вече са част от fs.files
документ, по подразбиране:
> 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"
}
За да прочетете действително файла от GridFS, ще трябва да извлечете файловия документ от fs.files
и парчетата от fs.chunks
. Най-ефективният начин да направите това е да предавате това към клиента парче по парче, така че да не се налага да зареждате целия файл в RAM. chunks
колекцията има следната структура:
> 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 */
}
Ако искате да използвате metadata
поле на fs.files
за вашите заявки се уверете, че разбирате обозначението с точки, напр.
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
също така се уверете, че вашите заявки могат да използват индекс с помощта на explain()
.