You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MongoRepository查询返回实体过慢问题求助

Spring Data MongoDB 实体转换性能异常排查求助

我已经查看过两个相关话题:Spring MongoRepository POJO转换过慢、Spring Data MongoDB性能问题。我遇到了类似问题,但和@DBRef无关,还没尝试通过自定义转换器解决。

刚接手一个没人熟悉的老项目,首要任务是优化性能。经过多项优化后,最后卡在一个问题上:查询约13000个实体耗时60秒。一开始以为是查询本身(查询prodId在指定集合中的所有数据)的问题,在MongoDB Compass中执行该查询耗时不到1秒,后来发现Compass是分页加载(每页最多100条),加载全量数据时速度也会变慢,但Spring Data的耗时还是异常高。

相关代码

实体类代码

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyEntity{

    @Field(value = "classId")
    private String classId;

    @Field(value = "prodId")
    private String prodId;

    @Field(value = "attributes")
    private List<AttributeEntity> attributes;

    [...] // 全参构造函数、getter、setter等
}

仓库接口代码

public interface MyEntityRepository extends MongoRepository<MyEntity, String> {

    List<MyEntity> findByProdIdIn(List<String> ids) throws SmartExchangeMongoException;
}

Compass中执行的查询语句

{ "prodId" : { "$in" : ["PROD_ID_1", "PROD_ID_ABCDE", "PROD_ID_0242525", ...] } }

已做的测试和尝试

  • prodId字段已建立索引
  • 原本使用spring-data-mongodb 3.3.0,升级到4.4.0后耗时无变化
  • 自定义查询:
    @Query( "{'prodId' : { '$in' : ?0}}")
    List<MyEntity> customFindByProdIdIn(List<String> ids) throws SmartExchangeMongoException;
    
    结果耗时和原方法完全相同
  • 在MariaDB中模拟类似场景:500000个MyEntity和1000000个AttributeEntity,执行相同查询(约13000个随机prodId),Spring Data执行查询并映射为Java对象耗时不到2秒,速度是MongoDB场景的30倍左右

求助问题

后续我该如何处理?为何这个查询执行耗时如此之久?求配置、仓库使用等方面的建议。我来自SQL领域,完全无法理解Spring Data将Mongo Document转换为Java实体为何如此困难,在MariaDB、PostgreSQL等数据库中执行类似操作从未有过这么高的耗时。希望先确认我们在基础用例中是否存在操作错误,目前已经陷入困境。

内容的提问来源于stack exchange,提问作者Antoine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:15:01