查询MongoDB GridFS?

查询MongoDB GridFS?,mongodb,node.js,mongoose,gridfs,Mongodb,Node.js,Mongoose,Gridfs,我有一个博客系统,将上传的文件存储到GridFS系统中。问题是,我不知道如何去查询它 我将Mongoose与NodeJS一起使用,NodeJS还不支持GridFS,因此我将实际的mongodb模块用于GridFS操作。似乎没有办法像查询常规集合中的文档那样查询文件元数据 将元数据存储在指向GridFS objectId的文档中是否明智?能够轻松地进行查询 任何帮助都将不胜感激,我有点卡住了:/元数据存储在元数据字段中。你可以像这样查询它 db.fs.files.find({metadata: {

我有一个博客系统,将上传的文件存储到GridFS系统中。问题是,我不知道如何去查询它

我将Mongoose与NodeJS一起使用,NodeJS还不支持GridFS,因此我将实际的mongodb模块用于GridFS操作。似乎没有办法像查询常规集合中的文档那样查询文件元数据

将元数据存储在指向GridFS objectId的文档中是否明智?能够轻松地进行查询


任何帮助都将不胜感激,我有点卡住了:/

元数据存储在元数据字段中。你可以像这样查询它

db.fs.files.find({metadata: {content_type: 'text/html'}}) 
其工作原理是为每个文件存储大量块。这样,您就可以交付和存储非常大的文件,而不必将整个文件存储在RAM中。此外,这使您能够存储大于最大文档大小的文件。建议的块大小为256kb

文件元数据字段可用于存储其他特定于文件的元数据,这比将元数据存储在单独的文档中更有效。这在很大程度上取决于您的具体需求,但元数据字段通常提供了很大的灵活性。请记住,默认情况下,一些更明显的元数据已经是
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 */
}
如果要使用
fs.files
metadata
字段进行查询,请确保您了解

另外,请确保您的查询可以使用索引。

如所述,您可以在元数据字段中存储任何需要的内容

以下是“文件”集合中的文档的外观:

必填字段

{
  "_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"});

我知道这个问题不是问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());
}
//获取数据库的GridFS
GridFS gfs=新的GridFS(“myDatabase”);
//在JSON.parse()中写出JSON查询并将其转换为DBObject
DBObject DBObject=(DBObject)JSON.parse(“{metadata:{gender:{gender:'Male'}”);
//查询操作(查找)
List gridFSDBFiles=gfs.find(dbObject);
//循环浏览结果
for(GridFSDBFile GridFSDBFile:gridFSDBFiles){
System.out.println(gridFSDBFile.getFilename());
}

这可能不是OP所期望的。该语法将查找子文档的精确匹配,即您的查询将不匹配
“metadata”:{“content\u type”:“text/html”,“foo”:“bar”}
。此外,该示例可能会让人困惑,因为
内容类型
fs.files
结构的一部分,但有不同的名称。如何在元数据字段上创建可用索引?您只需创建一个类似
{fs.files.metadata.my\u field:1}的索引即可
没有模式会大大简化某些事情,为什么大拇指朝下?
// 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());
}