Sun*_*e17 5 firebase google-cloud-firestore
我在 Firestore 中有 10k 个用户,每个用户\xe2\x80\x99s documentId 是他们的 uid,分数已注册到他们的文档中。为了找到Leaderboard的Top 20,它成功地根据其分数查询了Top 20用户,就像使用复合索引一样。
\n\nlet query = usersRef.order(by: scores, descending: true).limit(to: 20)\nquery.getDocuments() //to get 20 documents\nRun Code Online (Sandbox Code Playgroud)\n\n不幸的是,我找不到一种方法来处理当前未参与前20名的玩家的排名(索引号)。为什么Firestore不返回基于每个用户的查询的排名(索引号)\xe2 \x80\x99s uid?或者有其他方法可以解决 Firestore 中的问题吗?
\n您可以使用startAfter/startAt并提供文档参考来抵消您的查询。
因此,如果您有前二十条记录的列表,您可以重复完全相同的查询,但指定它是startAfter列表中的最后一个元素,然后您将返回位置的记录20,39等等。
您还可以将查询设置offset为返回在设定位置返回的结果,但是强烈不建议这样做,因为使用offset,您会为跳过的每个文档进行写入。因此,如果您想获取倒数 20 名玩家,您最终将等待 9,980 个文档读取!
您可以使用查询游标查看分页数据以获取更多信息。
就您现有的数据结构而言......
要通过用户标识符找出用户的排名,您可能需要手动缓存其当前排名。您可以设置一个计划任务来计算玩家的排名,每天计算每个玩家的排名。这将是昂贵的,因为每次执行的写入次数会随着用户数量的变化而变化;并且由于它是基于缓存的,因此受到时间限制(玩家在下次计算之前不会看到他们的排名变化。)
更简单的方法是取最高分、最低分,然后根据用户数量将它们的分数缩放到等效排名(这不一定必须是线性比例,您可以使用钟形曲线例如),但是这并不精确,并且多个用户可能看起来具有相同的排名。但是,根据您的用例,这可能是一个合适的让步。
另一种方法是让用户在尝试查看自己的排名时自行更新排名系统。它可以查看在其之前和之下的用户的分数,并通过确定它应该位于相邻记录之前还是之后来有效地保持排名。这将需要更复杂的规则结构来防止作弊,并且会在排名数据集中引入不连续性。
| 归档时间: |
|
| 查看次数: |
1566 次 |
| 最近记录: |