Возможно, здесь есть небольшая путаница в отношении того, что на самом деле представляет собой GridFS, поскольку на самом деле это не что-то что MongoDB «делает», но на самом деле это просто спецификация драйвера для хранения данных за пределами 16 МБ BSON в стандартных коллекциях.
Для этого существуют две коллекции, используемые реализациями GridFS. Один обычно называется «файлы», а другой — «фрагменты». Они имеют разные цели и не являются «выбором» того, где хранить, как вы просите.
Коллекция «файлы» предназначена для «метаданных», которые представляют собой лишь некоторую информацию о «файле», и в основном это то, что вы хотите. Это «описывает» файл и, что наиболее важно, действует как «ссылка» на _id
, используемый для идентификации файла в коллекции «фрагментов». В качестве образца:
db.fs.files.findOne()
{
"_id" : ObjectId("533b67d8afc27c15fc82caf4"),
"filename" : "twig.pl",
"chunkSize" : 262144,
"uploadDate" : ISODate("2014-04-02T01:28:56.915Z"),
"md5" : "9b10c69537126652aebc2742ca3ad69a",
"length" : 267
}
Итак, есть _id
и некоторые другие данные о файле. Это просто стандартная коллекция, и вы можете запросить ее как таковую.
Конечно, «фрагменты» на самом деле относятся к «частям» фактического «файла», и в краткой форме они будут выглядеть примерно так:
{
"_id" : ObjectId("533b67d8c6ed8872a7fa9ff0"),
"files_id" : ObjectId("533b67d8afc27c15fc82caf4"),
"n" : 0,
"data" : BinData(0,"IyEvdXNyL2Jpbi9lbnYg....")
}
И их будет столько, сколько потребуется для фактического хранения контента.
Что касается «размера» фрагментов, это, как правило, зависит от реализации драйвера, но обычно есть способ указать, что использовать, но из спецификации:
"По умолчанию GridFS ограничивает размер фрагмента до 255 КБ..."
Но, конечно, вы должны попытаться сохранить это в своей реализации. Как вы можете видеть из приведенного выше «мета» документа, спецификация заключается в том, чтобы «хранить» эту информацию с метаданными, чтобы это можно было определить при обратном чтении и «построении» своего рода дескриптора.
Таким образом, «реализация драйвера» фактически обрабатывает то, как происходят операции «чтения/записи» с фрагментами, и обычно делает что-то, чтобы представить результаты в виде своего рода «файла» или «потока». Но это всего лишь «обычные коллекции» и ничего особенного в себе. Таким образом, все обычные запросы и операции CRUD работают с этими коллекциями точно так же, как и с любыми другими.
person
Neil Lunn
schedule
16.09.2014