Получение звания Игрока в Firestore - PullRequest
0 голосов
/ 25 мая 2019

У меня есть 10 тыс. Пользователей в Firestore, и для каждого пользователя documentId - это их uid, а оценки зарегистрированы в их документе. Чтобы найти 20 лучших лидеров, он успешно получает запрос 20 лучших пользователей на основе своих оценок, используя составной индекс.

let query = usersRef.order(by: scores, descending: true).limit(to: 20)
query.getDocuments() //to get 20 documents

К сожалению, я не смог найти способ обработать ранг (номер индекса) текущего игрока, который не входит в Топ-20. Почему Firestore не возвращает ранг (номер индекса) запроса на основе каждого UID пользователя? или любым другим способом решить проблему в Firestore?

1 Ответ

0 голосов
/ 25 мая 2019

Вы можете использовать startAfter / startAt и предоставить ссылку на документ для смещения вашего запроса.

Таким образом, если у вас есть список из двадцати лучших записей, вы можете повторить тот же самый запрос, ноукажите, что это startAfter последний элемент в вашем списке, тогда вы будете возвращать записи для позиций от 20 до 39 и т. д.

Вы также можете установить запрос offset для возврата результатовэто вернуло бы в заданной позиции, однако это крайне не рекомендуется, потому что для использования offset вы выполняете запись для каждого пропускаемого документа.Поэтому, если вы хотите получить двадцать первых игроков, вам придется ждать 9 980 считываний документов!

Вы можете проверить Разбить данные на страницы с помощью курсоров запросов для получения дополнительной информации.

С точки зрения существующей структуры данных ...

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

Более упрощенный подход - взять верхний балл, нижнийОценка и масштабирование их баллов до эквивалентного ранга в зависимости от количества пользователей (это не обязательно должен быть линейный масштаб, вы можете использовать кривую колокольчика), однако это будет неточно и возможно для нескольких пользователейчтобы иметь одинаковый ранг.Тем не менее, это может быть подходящей уступкой в ​​зависимости от вашего варианта использования.

Другой способ - это заставить пользователей самостоятельно обновлять систему ранжирования, когда они пытаются просмотреть свой собственный рейтинг.Он может смотреть на точки пользователя, которые идут впереди него и под ним, и эффективно поддерживать ранги, определяя, должен ли он стать до или после соседних записей.Это потребовало бы более сложной структуры правил для предотвращения мошенничества и внесло бы разрыв в ваш набор данных рейтинга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...