首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用弹簧数据优化mongodb计数

用弹簧数据优化mongodb计数
EN

Stack Overflow用户
提问于 2020-04-23 16:52:15
回答 1查看 1.4K关注 0票数 0

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

我的代码如下所示-

代码语言:javascript
复制
MongoTemplate mongoTemplate = new MongoTemplate();
int count = (int) mongoTemplate.count(query, collectionName);

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

我试着索引一个在查询中使用的字段,如下所示-

代码语言:javascript
复制
int count = (int) mongoTemplate.count(query.withHint("fieldName"), collectionName);

性能略有提高,但仍有很多次上升到6秒。

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

代码语言:javascript
复制
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秒。用这个。我不知道我在这里做错了什么。

还有其他方法可以以优化的方式获得查询返回的记录的计数吗?

EN

回答 1

Stack Overflow用户

发布于 2020-04-24 08:16:13

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

这意味着:

通常,

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61392677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档