没有影响游标时间的限制aggrgate mongoDB

时间:2016-10-03 06:37:28

标签: mongodb mongodb-query limit aggregation-framework mongodb-aggregation

我正在汇总有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

1 个答案:

答案 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

在mongo shell中执行相同的查询

示例查询

  

无限制

db.foo.aggregate([ { 'conditions' }], {explain: true})
  

有限制

db.foo.aggregate([{ 'conditions' }, {$limit: 10}], {explain: true})

此外,您可能需要查看Performance of MongoDB queryOptimize QueryAnalyze Query Plancursor limit

希望它有所帮助!