【问题标题】:Creating a leaderboard scenario on Cloud Firestore在 Cloud Firestore 上创建排行榜场景
【发布时间】:2017-10-04 09:15:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: firebase google-cloud-firestore


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以在数据库控制台中对其进行过滤。中心列的右上角,靠近 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);
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多