3

我正在玩最近推出的Cloud Firestore,我想知道是否可以在集合中获取文档的索引来创建排行榜。

例如,假设我想检索用户在排行榜中的位置。我会做这样的事情:

db.collection('leaderboard').doc('usedId')

在那里,我有一个rank字段来显示该用户在排行榜中的位置。但是,这意味着我必须创建一个云函数来计算用户每次分数变化时的位置。考虑到 Firestore 按 CRUD 操作的数量收费,这可能非常昂贵。

有更好的方法吗?假设定义一个查询字段(即分数),然后在集合的数组中获取该文档的索引?

4

2 回答 2

2

您无法在查询结果中找到文档的位置,除非实际运行查询并阅读所有文档。这使得按分数排序仅用于确定排名是不可行的。

您可以通过将等级分组为 10 或 100 个块,然后仅在玩家在它们之间移动时更新等级组来减少更新等级的写入次数。绝对排名可以通过在组内按分数排序来确定。

如果您将这些等级组存储为单个文档,则可能会节省大量资金。

请注意,当您增加文档的作者数量时,这会增加争用,因此您需要平衡组大小与预期分数提交率,以获得您想要的结果。

聚合查询中的技术可以适应这个问题,但它们基本上具有您在问题中描述的相同成本权衡。

于 2017-10-04T19:27:32.027 回答
0

您可以在数据库控制台中对其进行过滤。中心列的右上角,在 3 个垂直点旁边。

您还可以使用此 GitHub 存储库搜索需要插入代码的查询:https ://github.com/firebase/snippets-web/blob/f61ee63d407f4a71ef9e677284c292b0a083d723/firestore/test.firestore.js#L928-L928

例如,如果您想根据用户的“highScores”对用户进行排名,您可以对前 10 名使用以下内容(并创建一个有序列表或类似列表,以表示用户的排名):

db.collection("leaderboard")
.orderBy("highScore", "desc").limit(10)  // this is the line you add to filter results
.get()
.then((snapshot) => {
  snapshot.docs.forEach((doc) => {
    console.log(doc.data()); 

    renderLeaderboard(doc);
  });
});
于 2021-04-11T19:22:03.047 回答