我正在使用 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);
查询的输出包含我需要迭代的大约 20k 条记录。问题是它需要几分钟:(。我认为不正常。从服务器日志中我看到:
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 秒,第二个 0.1 秒,第三个 106 秒!!!奇怪..我尝试更改批量大小,在 Date 和 IsClick 上创建索引,重新启动机器:P 但没办法。我哪里错了?