获取 Firestore 中玩家的排名

2024-01-05

我在 Firestore 中有 10k 个用户,每个用户的 documentId 是他们的 uid,分数注册到他们的文档中。为了找到Leaderboard的Top 20,它成功地根据其分数查询了Top 20用户,就像使用复合索引一样。

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

不幸的是,我找不到一种方法来处理当前未进入前 20 名的玩家的排名(索引号)。为什么 Firestore 不根据每个用户的 uid 返回查询的排名(索引号)?或者有其他方法可以解决 Firestore 中的问题吗?


您可以使用startAfter/startAt并提供文档参考来抵消您的查询。

因此,如果您有前 20 条记录的列表,您可以重复完全相同的查询,但指定它startAfter列表中的最后一个元素,然后您将返回位置记录20 to 39, etc.

还可以设置查询offset返回将在设定位置返回的结果,但是这是非常不推荐的,因为使用offset,您会为跳过的每个文档进行写入。因此,如果您想获取倒数 20 名玩家,您最终将等待 9,980 个文档读取!

您可以查看使用查询游标对数据进行分页 https://firebase.google.com/docs/firestore/query-data/query-cursors了解更多信息。

就您现有的数据结构而言......

要通过用户标识符找出用户的排名,您可能需要手动缓存其当前排名。您可以设置一个计划任务来计算玩家的排名,每天计算每个玩家的排名。这将是昂贵的,因为每次执行的写入次数会随着用户数量的变化而变化;并且由于它是基于缓存的,因此受到时间限制(玩家在下次计算之前不会看到他们的排名变化。)

更简单的方法是取最高分、最低分,然后根据用户数量将它们的分数缩放到等效排名(这不一定必须是线性比例,您可以使用钟形曲线示例),但是这并不精确,并且多个用户可能看起来具有相同的排名。但是,根据您的用例,这可能是一个合适的让步。

另一种方法是让用户在尝试查看自己的排名时自行更新排名系统。它可以查看在其之前和之下的用户的分数,并通过确定它是否应该位于相邻记录之前或之后来有效地保持排名。这将需要更复杂的规则结构来防止作弊,并且会在排名数据集中引入不连续性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 Firestore 中玩家的排名 的相关文章

随机推荐

  • 在 TOpenDialog 中右键单击文件时,使用自定义样式会显示无效字符

    请参阅以下步骤进行重现 在 XE2 中运行良好 但在 XE8 中运行不佳 创建新的 VCL 表单应用程序 Delphi Place a TButton and a TOpenDialog在表格上 在按钮中OnClick事件调用OpenDia
  • Matlab中值滤波器代码

    我需要在 MATLAB 中对图像实现中值滤波 然而 我是不允许使用medfilt2 or ordfilt2MATLAB 中的函数 我们最近也开始学习MATLAB 是否有任何代码可用于中值滤波器或高斯滤波器 NB 这假设已安装图像处理工具箱
  • 如何将 Comet 与 Spring MVC 一起使用?

    我想添加一些彗星 服务器推送 http en wikipedia org wiki Comet programming 简单 Web 应用程序的功能 我无法找到有关如何执行此操作的最新信息 任何人都可以向我指出一些示例 教程 博客或任何最近
  • Android ACR122U NFC 集成

    See NFC 读取器 SELECT 通过 AID APDU 未路由到 Android 设备 https stackoverflow com q 50316799 2425802关于调试和最终结果 TL DR 读者可能已经不复存在了 我的
  • 验证 Knuth 洗牌算法尽可能无偏

    我正在实施一个高德纳洗牌 http en wikipedia org wiki Fisher E2 80 93Yates shuffle对于我正在从事的 C 项目 我试图从我的洗牌中获得最公正的结果 而且我不是 伪 随机数生成方面的专家 我
  • 创建一个 firemonkey 组件

    我正在 Delphi XE4 中使用 Firemonkey 但无法使用菜单项 Component gt New Component 创建新组件 无论该组件是 VCL 还是 Firemonkey 组件 或者我是否先创建一个包 结果都是相同的
  • 如何从命令行执行 SOAP wsdl Web 服务调用

    我需要进行 SOAP Web 服务调用https sandbox mediamind com Eyeblaster MediaMind API V2 AuthenticationService svc wsdl https sandbox
  • 事件处理程序性能

    我有性能问题 我创建了 100 个新按钮 并且想要分配一个单击事件处理程序 我执行这段代码大约 100 次 Buttons i Button Click new System EventHandler Button Click 大约需要2秒
  • 发送参数到before_save

    我正在尝试以 rails 方式 构建一个应用程序 所以这次我不是回顾性地处理数据库中的记录 而是尝试使用 before save 方法来完成它们 即这个 def make percentage from score percent scor
  • 如何在 Dart 中合并两个列表?

    我想知道是否有一种简单的方法可以在 dart 中连接两个列表来创建一个全新的列表对象 我找不到任何东西和类似的东西 My list list1 1 2 3 list2 4 5 6 I tried var newList list1 list
  • 在python中通过ftp更改权限

    我正在使用 pythonftplib将图像上传到我的 raspberryPi 上位于 var www 的文件夹中 一切工作正常 除了上传的文件有600权限和我需要644对于他们来说 哪种方法最好 我正在寻找类似的东西 def ftp sto
  • PhpStorm - 导航后退键盘快捷键不起作用

    When I Ctrl click on method it will jump to declaration of that method 问题 如何跳回到该方法的使用 I tried Ctrl Alt Left combination
  • 用于随机森林分类的​​ ROC 曲线

    我在用randomForestR平台中用于分类任务的包 rf object lt randomForest data matrix label factor cutoff c k 1 k 其中 k 的范围为 0 1 到 0 9 pred l
  • 如何在 Ruby on Rails 中分析请求?

    如何分析控制器操作 我的一个观点是渲染需要相当长的时间 我想把它分解一下 我懂了script performance profiler 但这似乎只能访问全局范围 红宝石教授 http ruby prof rubyforge org 是要走的
  • 如何轻松获取 Scala 案例类的名称?

    Given case class FirstCC def name String something that will give FirstCC case class SecondCC extends FirstCC val one Fi
  • pyspark approxQuantile 函数

    我有包含这些列的数据框id price timestamp 我想找到按以下分组的中值id 我正在使用此代码来查找它 但它给了我这个错误 from pyspark sql import DataFrameStatFunctions as st
  • 如何使用angularjs动态显示表中的对象数组?

    我使用 angular js 作为我的字体端 使用 node js 作为服务器端 使用 PostgreSQL 作为数据库 现在 我在数据库中有一些值列表 数据库 控制器代码 我得到以下输出console console log scope
  • 计算二维数组的页面错误数

    我正在努力学习考试 我找到了这个例子 但不明白他们是如何得到答案的 有人可以解释一下吗 问题 考虑二维数组 A int A 新 int 100 100 其中 A 0 0 位于页大小为 200 的分页内存系统中的位置 200 操作矩阵的小进程
  • 带有自定义分配器但没有其他参数的 std::function 构造函数有什么意义?

    我正在玩标准 函数和自定义分配器 但当我不为函数提供初始函子时 它的行为并不像我预期的那样 当我向构造函数提供自定义分配器但没有初始函子时 分配器永远不会被使用 或者看起来是这样 这是我的代码 Simple functor class th
  • 获取 Firestore 中玩家的排名

    我在 Firestore 中有 10k 个用户 每个用户的 documentId 是他们的 uid 分数注册到他们的文档中 为了找到Leaderboard的Top 20 它成功地根据其分数查询了Top 20用户 就像使用复合索引一样 let