【发布时间】:2021-08-16 17:12:05
【问题描述】:
我有一个约 7000 个文档的 MongoDB 集合(称为“产品”),托管在 Mongo Atlas 共享集群上,看起来有点像这样:
{
identifier: 123,
archived: true,
/* Some other properties.. */
}
尝试以如下方式对上述集合运行简单查询:
mongoTemplate.find(
new Query().addCriteria(Criteria.where("archived").is(false)),
Product.class,
"Products");
导致执行时间非常长,本地实例和部署的 (Heroku) 版本都需要 8~9 秒。但是,当直接从 MongoRepository<> 运行相同的查询时,例如
repository.findByArchived(false),查询几乎立即运行(就像在 mongo CLI 中一样)。
我是否遗漏了一些额外的配置,这些配置会阻止 mongoTemplate 以更流畅的方式运行查询,例如预配置的 MongoRepository(例如一些 bson/POJO 编码)?对此的任何帮助将不胜感激!
【问题讨论】:
-
您能否确认在您的应用程序中没有额外的 mongo 相关过滤器/配置?或者换句话说,您可以使用最小代码在单独的应用程序中重现它。
-
尝试使用现有索引或添加索引:
new Query().addCriteria(Criteria.where("archived").is(false)).withHint("your_index") -
每个查询可以运行 3-4 次吗?好像您第一次使用
.addCriteria运行,然后当您运行findByArchived时,MongoDB 使用缓存并快速返回。同时为这两个查询提供.explain
标签: java mongodb spring-boot spring-data spring-data-mongodb