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 */
}
metadata
クエリに のフィールドを使用する場合は、ドット表記をfs.files
理解していることを確認してください。
> db.fs.files.find({"metadata.OwnerId": new ObjectId("..."),
"metadata.ImageWidth" : 280});
また、クエリが を使用してインデックスを使用できることを確認してくださいexplain()
。