GridFS работает, сохраняя количество фрагментов для каждого файла.Таким образом, вы можете доставлять и хранить очень большие файлы, не сохраняя весь файл в оперативной памяти.Кроме того, это позволяет хранить файлы, размер которых превышает максимальный размер документа.Рекомендуемый размер фрагмента составляет 256 КБ.
Поле метаданных файла можно использовать для хранения дополнительных метаданных, относящихся к файлу, что может быть более эффективным, чем хранение метаданных в отдельном документе.Это сильно зависит от ваших точных требований, но поле метаданных, как правило, предлагает большую гибкость.Имейте в виду, что некоторые из наиболее очевидных метаданных уже являются частью документа 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
.Наиболее эффективный способ сделать это - передать это клиенту по частям, поэтому вам не нужно загружать весь файл в ОЗУ.Коллекция 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()
.