我正在使用 Firestore 构建游戏,我想显示高分列表。
我目前通过以下查询获得了 10 个最高分:
const q = query(doc(db, "scores", title), orderBy("score", "desc"), limit(10));
除此之外,我想让玩家知道他们与全球高分相比的表现如何。例如,如果他们获得了第 956 名最高分,我希望他们知道他们的相对位置是 956。
我已经看到了,对于cursors https://firebase.google.com/docs/firestore/query-data/query-cursors,可以提供给定文档的偏移量,即:
const q = query(doc(db, "scores", title), orderBy("score", "desc"), limit(10), startAt(myScoreDocRef));
有没有办法从中获取分数在排序结果集中的逻辑索引?
最近添加了 FirestoregetCountFromServer() https://firebase.google.com/support/release-notes/js#version_9110_-_october_06_2022 (API参考 https://firebase.google.com/docs/reference/js/firestore_.md#getcountfromserver) 函数非常适合此用例。您可以创建一个查询来匹配分数大于当前用户分数的文档并获取计数,如下所示:
const currentUserScore = 24;
const q = query(
collection(db, 'users'),
orderBy('score', 'desc'),
where('score', '>', currentUserScore)
)
// number of users with higher score
const snapshot = await getCountFromServer(q)
console.log(`Your rank: ${snapshot.data().count + 1}`)
但是,如果多个用户具有相同的分数,他们都会在该查询中看到相同的排名。作为解决方法,除了分数之外,您还可以向排名添加另一个参数,例如查询具有相同分数的用户并检查用户年龄等。
对于每批最多 1000 个与查询匹配的索引条目,计数查询只需读取 1 次(根据文档 https://firebase.google.com/docs/firestore/pricing#aggregation_queries)所以它比查询具有一定偏移量的用户并手动计算排名要高效得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)