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
для ваших запросов, убедитесь, что вы понимаете dot notation, например,
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
также убедитесь, что ваши запросы могут использовать индекс, используя explain()
.
Как создать создать полезный индекс в поле метаданных? –
Вы можете просто создать индекс, подобный '{fs.files.metadata.my_field: 1}' Не имея схемы, значительно упрощает некоторые вещи – mnemosyn