我有一个博客系统,可将上传的文件存储到GridFS系统中。问题是,我不知道如何查询它!
我将Mongoose与尚未支持GridFS的NodeJS一起使用,因此我将实际的mongodb模块用于GridFS操作。没有SEEM可以像常规集合中的文档一样查询文件元数据。
将元数据存储在指向GridFS objectId的文档中是否明智?可以轻松查询?
任何帮助将不胜感激,我有点卡住了:/
GridFS通过为每个文件存储许多块来工作。这样,您可以交付和存储非常大的文件,而不必将整个文件存储在RAM中。另外,这使您可以存储大于最大文档大小的文件。建议的块大小为256kb。
文件元数据字段可用于存储其他特定于文件的元数据,这比将元数据存储在单独的文档中更为有效。这在很大程度上取决于您的确切要求,但是通常,元数据字段提供了很大的灵活性。请记住,fs.files默认情况下,一些更明显的元数据已经是文档的一部分:
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集合具有以下结构:
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进行查询,请确保您理解点符号,例如
metadata
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."), "metadata.ImageWidth" : 280});
还请确保您的查询可以使用的索引explain()。
explain()