mongodb - 查询 MongoDB GridFS?

标签 mongodb node.js mongoose gridfs

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

我在 NodeJS 中使用 Mongoose,它尚不支持 GridFS,因此我使用实际的 mongodb 模块进行 GridFS 操作。 SEEM 没有办法像查询常规集合中的文档那样查询文件元数据。

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

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

最佳答案

GridFS通过为每个文件存储多个 block 来工作。这样,您可以传送和存储非常大的文件,而不必将整个文件存储在 RAM 中。此外,这使您能够存储大于最大文档大小的文件。推荐的 block 大小为 256kb。

文件元数据字段可用于存储额外的文件特定元数据,这比将元数据存储在单独的文档中更有效。这在很大程度上取决于您的具体要求,但元数据字段通常提供了很大的灵 active 。请记住,默认情况下,一些更明显的元数据已经是 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 中获取 block 。最有效的方法是将其逐 block 传输到客户端,这样您就不必将整个文件加载到 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.filesmetadata 字段进行查询,请确保您了解 dot notation ,例如

> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."), 
                    "metadata.ImageWidth" : 280});

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

关于mongodb - 查询 MongoDB GridFS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8516550/

相关文章:

javascript - 使用 Mongoose 更新 Node.js 中 find() 方法返回的结果

node.js - Npm 测试找不到 socket.io.js 文件

node.js - 给定父文档和子文档中的值,我应该如何找到 Mongoose 子文档?

html - Mongodb $push 运算符不起作用

java - Mongo数据库Invalid BSON字段名异常

MongoDB 身份验证数据库用途

javascript - 这个 HTTP-Get Basic 身份验证代码有什么问题?

node.js - 构建我的 Mongoose 模式 : embedded array , 填充的最佳方法,子文档?

Javascript/NodeJS : html rendering before . 在 forEach 内查找完成

node.js - MongoDB 中双重嵌套数组的聚合文档