当前位置: 首页 > 知识库问答 >
问题:

优化mongo查询以在很短的时间内获得最大日期

柳弘方
2023-03-14

我正在使用下面的查询来获取名为KPI的集合中的最大日期(字段名为提取日期),并且由于我只对字段提取日期感兴趣:

@Override
public Mono<DBObject> getLastExtractionDate(MatchOperation matchOperation,ProjectionOperation projectionOperation) {
    return Mono.from(mongoTemplate.aggregate(
            newAggregation(
                    matchOperation,
                    projectionOperation,
                    group().max(EXTRACTION_DATE).as("result"),
                    project().andExclude("_id")
            ),
            "kpi",
            DBObject.class
    ));
}

正如您在上面看到的,我需要首先使用匹配操作(matchAction)过滤结果,之后,我正在执行投影操作以仅提取字段“提取日期”的最大值并将其重命名为结果。

但是这个查询花费了很多时间(有时超过20秒),因为我有大量的数据,我已经在字段extractionDate上添加了一个索引,但我没有获得太多,所以我正在寻找一种尽可能快的方法。

共有1个答案

伍皓
2023-03-14

索引调整将更多地依赖于$匹配表达式中的属性。您应该能够使用mongonh运行查询并获取解释计划以确定您的查询是否正在扫描集合。

其他需要考虑的是集合的大小与服务器的工作集。

也许可以使用$匹配表达式、解释计划以及当前的索引定义集更新您的问题,我们可以改进索引策略。

最后,什么是相当主观的巨大?您是在查询数百万或数十亿还是文档,平均文档大小是多少?

 类似资料:
  • 如果它们是具有以下数据的两个过程,甘特图应该如何?(SRTF 调度) 进程到达突发 P1 0 17 P2 1 16 那么,进程P1会先完成,然后P2会开始执行……还是P1必须等待16毫秒?

  • 问题内容: 如果我有一个表列,,, 并且我想运行一个sql查询以获取数据集中最早的记录。 您可以在查询中执行此操作,还是需要在事实之后循环? 我想获取该记录的所有字段。 问题答案: 如果您只想要日期: 如果您需要所有信息: 尽可能避免循环。循环通常会导致游标,游标几乎从来没有必要,而且常常效率很低。

  • 问题内容: 这就是整个查询… 如果… 和… 有明显的理由吗? 正在服用? 扩展说明 问题答案: 您可以始终使用EXPLAIN或EXPLAIN EXTENDED 来查看MySql对查询所做的操作 您也可以用稍微不同的方式编写查询,是否尝试过以下方法? 看看效果如何会很有趣。我希望它会更快,因为目前,我认为MySql将为您拥有的每个节目运行内部查询1(这样一个查询将运行多次。联接应该更有效。) 如果希

  • 如何获得最大截面。Id位于下面的文档中,其中包含集合_id=一些参数 我在下面试过了 但是,它不是返回max int单个值,而是返回一个包含部分数组中所有Ids的数组。 在节点中执行时,进一步执行相同的查询。js它返回一个空数组。

  • 问题:有没有办法知道收集中样本文档的实际大小(即oplog)? 我的oplog对于数据来说似乎太小了。我知道哪些查询可能是最大的贡献者,但我想在这样做之前评估一下减少查询的影响。 以下是一些背景: PS:一般来说,每个文档平均250kb似乎太多了,不是吗? 提前谢谢你!

  • 问题内容: 如何在Elasticsearch中计算最大和最小日期之间的小时数(最大和最小相同树级别)? 我的查询: 响应(简短)为 任何人都可以帮助我找出解决方案吗?提前致谢。 问题答案: 您可以利用管道聚合来计算每个存储区的最小值和最大值之间的差异。 只需在同一级别添加以下和: 对于上面的示例数据,在这种情况下,结果将为0.0175(即大约1分钟)