n ファイルの制限を含む MongoDB GridFS に対してクエリを実行する効率的な方法を見つけることができないようです。
これが私が試したことです。
DBCursor fileList = products.getFileList().limit(10);
while(fileList.hasNext()){
DBObject fileDef = fileList.next();
file = products.findOne((String)fileDef.get("filename"));
InputStream stream = file.getInputStream();
...
}
これに関する問題は、実際には 21 のクエリ操作が発生することです。
1 つ目は、実際に DBCollection.find() を呼び出す getFileList() です。
次に、結果ごとに findOne() が発生し、最終的に DBCollection.find({"filename":filename})10
回が呼び出されます。
その後、入力ストリームで read を呼び出すと、すべての10
ファイルのチャンク コレクションで findOne("files_id":id) が呼び出されます。
GridFS.find() では、ファイル コレクションを照会し、各 DBObject を GridFSDBFile に変換し、その (fs) 変数をthis
(GridFS) に設定していることに気付きました。(これはすべて injectGridFSInstance(Object) を介して)
getFileList() 操作でこれも同様に実行された場合、すべて問題ありませんが、標準のカーソルが返されるだけです。DBObject を GridFSDBFile にキャストできますが、InputStream で read を呼び出そうとすると、GridFS インスタンスが定義されていないため、チャンクを取得するために必要な情報がないと不平を言います。
fs 変数を設定できるようにしたいのですが、それはプライベートです。
結論:
クエリ操作の数を 2 倍にする必要がない .limit(n) を含む GridFS でクエリを実行する方法はありますか。