首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取玩家在Firestore中的排名

获取玩家在Firestore中的排名
EN

Stack Overflow用户
提问于 2019-05-25 15:07:00
回答 1查看 882关注 0票数 5

我在Firestore中有10k个用户,每个用户的documentId是他们的uid,分数注册到他们的文档中。为了找到排行榜的前20名,它成功地根据排名前20名的用户的得分进行查询,就像使用综合索引一样。

代码语言:javascript
复制
let query = usersRef.order(by: scores, descending: true).limit(to: 20)
query.getDocuments() //to get 20 documents

不幸的是,我找不到处理排名的方法(索引号)不在TOP20的当前玩家,Firestore为什么不返回排名(索引号)基于每个用户的uid的查询?或者其他任何方法来解决Firestore中的问题?

EN

回答 1

Stack Overflow用户

发布于 2019-05-25 15:12:11

您可以使用startAfter/startAt并提供文档引用来补偿您的查询。

因此,如果您有一个前20个记录的列表,您可以重复完全相同的查询,但指定它为列表中的最后一个元素,然后返回2039等位置的记录。

您还可以将查询offset设置为返回在设置位置返回的结果,但是强烈不推荐这样做,因为使用offset时,您跳过的每个文档都会发生写操作。因此,如果您想获取倒数20名玩家,您最终将等待9980个文档读取!

您可以查看Paginate data with query cursors以了解更多信息。

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

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

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

另一种方法是当用户试图查看自己的排名时,让用户自己更新排名系统。它可以查看用户在它之前和下面的分数,并通过确定它应该在相邻记录之前还是之后有效地维护自己。这将需要一个更复杂的规则结构来防止作弊,并将在您的排名数据集中引入不连续。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56302572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档