我正在尝试获取由特定的mongo查询产生的记录总数。总记录约为9万。我正在使用spring数据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秒。用这个。我不知道我在这里做错了什么。
还有其他方法可以以优化的方式获得查询返回的记录的计数吗?
发布于 2020-04-24 08:16:13
若要返回与查询匹配的文档数,所有文档都需要由服务器标识。这基本上意味着计数相当于在所有条件下执行查找,并在服务器中遍历所有结果(结果不放在要返回给客户端的线路上,但其他一切都会发生)。
这意味着:
通常,
因此,您需要查看您的条件和索引,并确保查询可以使用您的索引。
https://stackoverflow.com/questions/61392677
复制相似问题