@DeFaNJI

Как оптимизировать запрос к MongoDB?

Здравствуйте, у меня есть запрос к MongoDB для получения места пользователя в топе.
const getTopUserPosition = async (id, skip = 0, name) => { 
        /* 
        Тут я получаю 1 000 айди пользователей, которые НЕ являются админами и сортирую их по убыванию баланса.
       */
        const users = await (await User.find({ admin: 0 }, { id: true, _id: false, }).skip(skip).limit(1_000).sort({
            [`${name}`]: -1
        })).map(x => x.id) /* Массив обьектов [ { id: 222856843 } ] привожу к [ 222856843 ] */

        if (!users.length) return 0 /* Если длина массива равна нулю, то возвращаю позицию игрока 0. Это сделано, если в бд только админы и запрос нету смысла исполнять */
        /* 
Если айди человека в этом массиве не найдено, то еще раз вызывается эта функция с пропуском первых 1 000 записей в бд и критерием сортировки
       */
        if (!users.includes(id) || users.indexOf(id) < 0) return getTopUserPosition(id, skip + 1_000, name) 
        
        const userPosition = users.indexOf(id) + 1

        return userPosition + skip
    },


Данный запрос занимает ОЧЕНЬ много времени. К примеру сейчас у меня в БД около 21к человек и данный запрос совершается за 9 секунд. По сравнению с тем, как я получаю топ (10 человек, ответ приходит за 135 мс) это очень долго. Возможно-ли как то облегчить данный запрос? Не смог придумать другого варианта, но и этот никуда не годится.
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@DeFaNJI Автор вопроса
Решением оказался вот такой код, вместо моего:

const user = await User.find({ id: id });
        const userPosition = await User.find({"$gt": user[name]}).sort({ name: -1 }).count();
        
        return userPosition;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы