Запрашиваете MongoDB GridFS? - PullRequest
       7

Запрашиваете MongoDB GridFS?

8 голосов
/ 15 декабря 2011

У меня есть система ведения блогов, которая сохраняет загруженные файлы в систему GridFS.Проблема в том, что я не понимаю, как сделать запрос!

Я использую Mongoose с NodeJS, который еще не поддерживает GridFS, поэтому я использую настоящий модуль mongodb для операций GridFS.Не существует SEEM, чтобы можно было запрашивать метаданные файлов, как вы делаете документы в обычной коллекции.

Было бы целесообразно хранить метаданные в документе, указывающем на идентификатор объекта GridFS?чтобы легко иметь возможность запрашивать?

Любая помощь будет с благодарностью, я вроде застрял: /

Ответы [ 4 ]

18 голосов
/ 15 декабря 2011

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().

6 голосов
/ 15 декабря 2011

Как сказано в спецификации , в поле метаданных можно хранить все, что вы захотите.

Вот как выглядит документ из коллекции файлов:

Обязательные поля

{
  "_id" : <unspecified>,                  // unique ID for this file
  "length" : data_number,                 // size of the file in bytes
  "chunkSize" : data_number,              // size of each of the chunks.  Default is 256k
  "uploadDate" : data_date,               // date when object first stored
  "md5" : data_string                     // result of running the "filemd5" command on this file's chunks
}

Необязательные поля

{    
  "filename" : data_string,               // human name for the file
  "contentType" : data_string,            // valid mime type for the object
  "aliases" : data_array of data_string,  // optional array of alias strings
  "metadata" : data_object,               // anything the user wants to store
}

Так что храните все, что вы хотите, в метаданных и запрашивайте их, как обычно, в MongoDB:

db.fs.files.find({"metadata.some_info" : "sample"});
2 голосов
/ 02 июня 2015

Я знаю, что этот вопрос не задает вопрос о способе запроса метаданных в Java, но здесь, если вы добавите gender в качестве поля метаданных:

// Get your database's GridFS
GridFS gfs = new GridFS("myDatabase);

// Write out your JSON query within JSON.parse() and cast it as a DBObject
DBObject dbObject = (DBObject) JSON.parse("{metadata: {gender: 'Male'}}");

// Querying action (find)
List<GridFSDBFile> gridFSDBFiles = gfs.find(dbObject);

// Loop through the results
for (GridFSDBFile gridFSDBFile : gridFSDBFiles) {
    System.out.println(gridFSDBFile.getFilename());
}
0 голосов
/ 15 декабря 2011

метаданные хранятся в поле метаданных. Вы можете запросить его как

db.fs.files.find({metadata: {content_type: 'text/html'}}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...