首页 > 解决方案 > Spring Boot mongoTemplate 计数查询很慢

问题描述

我正在编写一个 API 来从我的 mongoDB 中获取与通过的条件相对应的文章。例如,如果用户定义了开始和结束日期,它将仅在该时间范围内进行搜索。如果他定义了一个来源,它将在该时间段内仅搜索那些特定的来源。除了用户不提供任何标准时,这一切都运行良好。在这种情况下,我应该只返回Pageable参数中默认定义的 100 篇文章。排除标准聚合到一个Query对象,他的全部都是这样完成的:

List<Article> articles = mongoTemplate.find(query, Article.class);

return PageableExecutionUtils.getPage(articles,
        pageable, 
        () -> mongoTemplate.count(Query.of(query).limit(-1).skip(-1), Article.class));

由于查询为空,它只获取所有文档并对所有文章进行计数。我尝试将计数部分硬编码为 1000 之类的随机数。在这种情况下,整个操作大约需要 200 毫秒。但如果我把它留在上面,mongoTemplate.count(...)它需要高达 1 分 30 秒。另一方面,如果我通过 Robo3t 进行计数查询,db.getCollection('articles').find({}).count()则需要 37 毫秒。大多数字段都已编入索引,并且条目数略低于 600,000,所以我不知道为什么计数需要这么长时间。任何想法为什么 robo3t 和 mongoTemplate 之间存在这种时间差异以及如何解决它?

我也尝试过使用MongoRepository相同的结果进行相同的查询。

标签: javaspringmongodbspring-bootmongotemplate

解决方案


推荐阅读