GridFS 通过为每个文件存储多个块来工作。这样,您可以交付和存储非常大的文件,而无需将整个文件存储在 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 字段进行查询,请确保您了解dot notation,例如
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
还要确保您的查询可以使用使用explain() 的索引。