私はmongoDBを使用してクエリログを保存し、それに関する統計を取得しています。私がmongoDBに保存するオブジェクトには、クエリのテキスト、日付、ユーザー、ユーザーが結果をクリックした場合などが含まれます。
今、特定の日にユーザーがクリックしなかったすべてのクエリを Java で取得しようとしています。私のコードはおよそこれです:
DBObject query = new BasicDBObject();
BasicDBObject keys = new BasicDBObject();
keys.put("Query", 1);
query.put("Date", new BasicDBObject("$gte", beginning.getTime()).append("$lte", end.getTime()));
query.put("IsClick", false);
...
DBCursor cur = mongoCollection.find(query, keys).batchSize(5000);
クエリの出力には、反復する必要がある約 20,000 レコードが含まれています。問題は、数分かかることです:(。私は正常ではないと思います。サーバーログから私は見ます:
Wed Nov 16 16:28:40 query db.QueryLogRecordImpl ntoreturn:5000 reslen:252403 nscanned:59260 { Date: { $gte: 1283292000000, $lte: 1283378399999 }, IsClick: false } nreturned:5000 2055ms
Wed Nov 16 16:28:40 getmore db.QueryLogRecordImpl cid:4312057226672898459 ntoreturn:5000 query: { Date: { $gte: 1283292000000, $lte: 1283378399999 }, IsClick: false } bytes:232421 nreturned:5000 170ms
Wed Nov 16 16:30:27 getmore db.QueryLogRecordImpl cid:4312057226672898459 ntoreturn:5000 query: { Date: { $gte: 1283292000000, $lte: 1283378399999 }, IsClick: false } bytes:128015 nreturned:2661 --> 106059ms
したがって、最初のチャンクの取得には 2 秒、2 番目のチャンクの取得には 0.1 秒、3 番目のチャンクの取得には 106 秒かかります!!! 奇妙な..バッチサイズを変更し、DateとIsClickにインデックスを作成し、マシンを再起動しようとしました:Pですが、方法はありません。どこが間違っていますか?