Оптимизация подсчета mongodb с помощью пружинных данных - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь получить общее количество записей, полученных в результате определенного запроса 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 секунд. с этим. Я не знаю, что я, возможно, делаю здесь неправильно.

Есть ли другой способ оптимизировать подсчет количества записей, возвращаемых запросом?

1 Ответ

0 голосов
/ 24 апреля 2020

Чтобы узнать, сколько документов соответствует запросу, все документы должны быть идентифицированы сервером. Это в основном означает, что подсчет эквивалентен выполнению поиска со всеми условиями и прохождению всех результатов на сервере (результаты не передаются по проводам, чтобы быть возвращенными клиенту, но все остальное происходит).

Это означает:

  1. Операции подсчета обычно занимают столько же времени, сколько находки, а иногда значительно дольше, если находки ограничены (поскольку нет смысла ограничивать подсчет).
  2. Все соображения по индексированию, применимые к находкам, также относятся к найденным значениям.

Итак, вам нужно посмотреть на ваши условия и индексы и убедиться, что ваши индексы могут использоваться вашим запросом.

...