gpt4 book ai didi

java - 使用spring data优化mongodb的计数

转载 作者:行者123 更新时间:2023-12-01 17:15:48 25 4
gpt4 key购买 nike

我正在尝试获取特定 mongo 查询产生的记录总数。总记录约为90k。我正在使用 spring data mongo 来实现这一点。

我的代码如下所示 -

MongoTemplate mongoTemplate = new MongoTemplate();
int count = (int) mongoTemplate.count(query, collectionName);

这里的查询是根据用户请求构建的,因此事先是未知的。这会在大约 6 秒内给出结果,这对于我们的应用程序来说太长了,因此请求超时。

我尝试对查询中使用的一个字段建立索引,如下所示 -

int count = (int) mongoTemplate.count(query.withHint("fieldName"), collectionName);

性能有所提高,但仍然很多时候达到 6 秒。

然后,我尝试通过在 CountOptions 中使用skip/limit 来多次调用 mongo,如下所示 -

int limit = 1000;
int offset = 0;
int total = 0;
MongoCollection<Document> collection = mongoTemplate.getCollection("collectionName");
query.fields().include("_id");

while (total == offset) {

CountOptions countOptions = new CountOptions().hintString("fieldName").limit(limit).skip(offset);

total += (int) collection.count(query.getQueryObject(), countOptions);
offset += limit;
}

我不知道这个逻辑背后发生了什么,但时间实际上增加到了大约 20 秒。有了这个。我不知道我在这里做错了什么。

是否有其他方法可以以优化的方式获取查询返回的记录数?

最佳答案

要返回与查询匹配的文档数量,服务器需要识别所有文档。这基本上意味着计数相当于在所有条件下执行查找并遍历服务器中的所有结果(结果不会放在网络上返回给客户端,但其他一切都会发生)。

这意味着:

  1. 计数操作的时间通常与查找的时间一样长,如果查找有限,有时甚至会更长(因为限制计数没有意义)。
  2. 适用于查找结果的所有索引注意事项也适用于计数。

因此,您需要查看条件和索引,并确保您的查询可以使用您的索引。

关于java - 使用spring data优化mongodb的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61392677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com