首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询MongoDB GridFS?

查询MongoDB GridFS?
EN

Stack Overflow用户
提问于 2011-12-15 15:33:18
回答 4查看 21.2K关注 0票数 10

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

我使用的是带有NodeJS的Mongoose,它还不支持GridFS,所以我使用实际的mongodb模块来执行GridFS操作。似乎没有一种方法可以像查询常规集合中的文档那样查询文件元数据。

将元数据存储在指向GridFS objectId的文档中是否明智?为了能够方便的查询?

任何帮助都会非常感谢,我有点卡住了:/

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-15 17:26:51

GridFS的工作方式是为每个文件存储多个块。这样,您就可以交付和存储非常大的文件,而不必将整个文件存储在RAM中。此外,这使您能够存储大于最大文档大小的文件。建议的区块大小为256kb。

文件元数据字段可用于存储附加的特定于文件的元数据,这比将元数据存储在单独的文档中更有效。这在很大程度上取决于您的确切需求,但元数据字段通常提供了很大的灵活性。请记住,默认情况下,一些比较明显的元数据已经是fs.files文档的一部分:

代码语言:javascript
运行
复制
> 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集合具有以下结构:

代码语言:javascript
运行
复制
> 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.filesmetadata字段进行查询,请确保理解dot notation,例如

代码语言:javascript
运行
复制
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."), 
                    "metadata.ImageWidth" : 280});

还要确保您的查询可以使用使用explain()的索引。

票数 23
EN

Stack Overflow用户

发布于 2011-12-15 17:29:53

正如specification所说,您可以在元数据字段中存储任何您想要的内容。

下面是files集合中的文档的外观:

必填字段

代码语言:javascript
运行
复制
{
  "_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
}

可选字段

代码语言:javascript
运行
复制
{    
  "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中一样正常地查询它:

代码语言:javascript
运行
复制
db.fs.files.find({"metadata.some_info" : "sample"});
票数 7
EN

Stack Overflow用户

发布于 2015-06-03 00:09:01

我知道这个问题并没有问到Java查询元数据的方式,但这里有一个问题,假设您将gender添加为元数据字段:

代码语言:javascript
运行
复制
// 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());
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8516550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档