Я пытаюсь получить общее количество записей, полученных в результате определенного запроса mon go. Всего записей около 90к. Для этого я использую данные пружины mon go.
Мой код выглядит следующим образом -
MongoTemplate mongoTemplate = new MongoTemplate();
int count = (int) mongoTemplate.count(query, collectionName);
Здесь запрос строится на основе запроса пользователя, поэтому он заранее не известен. Это дает результат примерно через 6 секунд, что слишком много для нашего приложения, и поэтому запрос просто истекает.
Я попытался проиндексировать одно поле, которое использовалось в запросе, как показано ниже -
int count = (int) mongoTemplate.count(query.withHint("fieldName"), collectionName);
Производительность немного улучшилась, но все равно много раз она поднималась до 6 секунд.
Затем я попытался сделать несколько вызовов на mon go, используя skip / limit в CountOptions, как показано ниже -
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;
}
Я не знаю, что происходит за кулисами в этой логике c, но время фактически увеличилось примерно до 20 секунд. с этим. Я не знаю, что я, возможно, делаю здесь неправильно.
Есть ли другой способ оптимизировать подсчет количества записей, возвращаемых запросом?