【发布时间】:2022-06-14 17:51:55
【问题描述】:
我正在使用下面的查询来获取名为 KPI 的集合中的最大日期(名为 extractDate 的字段),因为我只对字段 extractDate 感兴趣:
@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
));
}
正如您在上面看到的,我需要首先使用匹配操作(matchOperation)过滤结果,然后我正在执行投影操作以仅提取字段“extractionDate”的最大值并将其重命名为结果。
但是这个查询花费了很多时间(有时超过20秒),因为我有大量的数据,我已经在字段extractionDate上添加了一个索引但是我没有收获很多,所以我正在寻找一种尽可能快地掌握它的方法。
更新:
我们在集合 kpi 中拥有的文档数:42.8m 个文档
正在执行的查询:
Streaming aggregation: [{ "$match" : { "type" : { "$in" : ["INACTIVE_SITE", "DEVICE_NOT_BILLED", "NOT_REPLYING_POLLING", "MISSING_KEY_TECH_INFO", "MISSING_SITE", "ACTIVE_CIRCUITS_INACTIVE_RESOURCES", "INCONSISTENT_STATUS_VALUES"]}}}, { "$project" : { "extractionDate" : 1, "_id" : 0}}, { "$group" : { "_id" : null, "result" : { "$max" : "$extractionDate"}}}, { "$project" : { "_id" : 0}}] in collection kpi
【问题讨论】:
-
性能提示:(1)匹配操作查询中使用的字段可以使用索引进行高效过滤。 (2) 小组赛前的投影操作可能不需要,除非你正在执行一些计算来得到那个日期。
标签: java spring mongodb spring-data-mongodb mongotemplate