Здравствуйте, у меня есть запрос к 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 мс) это очень долго. Возможно-ли как то облегчить данный запрос? Не смог придумать другого варианта, но и этот никуда не годится.