我正在汇总有100万条记录的集合上的数据。 匹配查询使用索引。 查找下面的代码参考 -
AggregateIterable<Document> aggregateIterable = timeCollection.aggregate(Arrays.asList(match, project,group)).batchSize(1000).allowDiskUse(true);
long curStartTs = Calendar.getInstance().getTimeInMillis();
MongoCursor<Document> cursor = aggregateIterable.iterator(); //this line roughly takes 15 seconds
long curEndTs = Calendar.getInstance().getTimeInMillis();
System.out.println("Cursor time - " + (curEndTs - curStartTs));
最终结果列表包含3500条记录。
现在我通过在汇总管道中传递 $ limit 来限制记录为 -
Document limitParam = new Document("$limit",30);
AggregateIterable<Document> aggregateIterable = timeCollection.aggregate(Arrays.asList(match, project,group,limitParam)).batchSize(1000).allowDiskUse(true);
long curStartTs = Calendar.getInstance().getTimeInMillis();
MongoCursor<Document> cursor = aggregateIterable.iterator(); //this line still taking around 15 seconds
long curEndTs = Calendar.getInstance().getTimeInMillis();
System.out.println("Cursor time - " + (curEndTs - curStartTs));
最终结果列表现在只包含30条记录。
我无法理解为什么两种情况下没有时间变化。 即使在管道中提供限制之后,为什么 aggregateIterable.iterator()与管道中没有限制的情况相同?
提前多多感谢。
亲切的问候,Vibhav
答案 0 :(得分:1)
Aggregation $limit对其传递的文件内容没有影响。
通过查看代码
long curStartTs = Calendar.getInstance().getTimeInMillis();
MongoCursor<Document> cursor = aggregateIterable.iterator(); //this line roughly takes 15 seconds
long curEndTs = Calendar.getInstance().getTimeInMillis();
System.out.println("Cursor time - " + (curEndTs - curStartTs));
您正在尝试查找执行查询所需的时间。
为了更好地了解MongoDB执行这些查询所花费的时间,我们可以使用explain
示例查询
无限制
db.foo.aggregate([ { 'conditions' }], {explain: true})
有限制
db.foo.aggregate([{ 'conditions' }, {$limit: 10}], {explain: true})
此外,您可能需要查看Performance of MongoDB query,Optimize Query,Analyze Query Plan和cursor limit
希望它有所帮助!