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()
を使用してインデックスを使用できることを確認してください 。