具有Firebase云功能的排行榜

时间:2018-10-24 20:38:58

标签: javascript firebase firebase-realtime-database google-cloud-functions

我当前的数据库结构如下:enter image description here

基本上有一个mobile_users表和一个排在前100位的表。

我试图弄清楚如何编写一个执行每分钟执行一次的云函数,该函数使用用户ID,来自mobile_users的earned_points并按Earned_points对其进行排序来更新/填充top100表。

我应该在此表上添加一个排名字段,还是有一种方法可以基于mobile_users从asc / desc顺序对表进行排序?

我当前的功能如下

exports.dbRefOnWriteEvent = functions.database.ref('/mobile_user/{userId}/{earned_points}').onWrite(event => {
    var ref = admin.database().ref("/top100");
    ref.orderByChild("earned_points").once("value", function(dataSnapshot) {
        var i = 0;
        dataSnapshot.forEach(function(childSnapshot) {
          var r = (dataSnapshot.numChildren() - i);
          childSnapshot.ref.update({rank: r},function(error) {
              if (error != null)
                console.log("update error: " + error);
          });
          i++;
        });
    });
});

我还没有弄清楚如何告诉云功能每分钟执行一次。我在构造这些类型的查询时遇到了麻烦。

我的函数也无法使用这3个当前用户填充top100表。如果有人能指出我正确的方向,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

创建一个http请求函数来完成您的业务。

然后使用cron-job每分钟调用一次http firebase函数:cron-job

答案 1 :(得分:0)

也许您的数据库中可以有两个根节点。类似于上面的一个,另一个节点称为页首横幅。

第二个节点可以是一个数组,其中索引反映排名,名称反映得分。

Leaderboard
           |-- [0] 
                |-- score: 5000
                |-- uid: 4zzdawqeasdasq2w1
           |---[1]
                |-- score: 4990
                |-- uid: 889asdas1891sadaw

然后,当您获得新的分数时,您将更新用户的节点,然后还更新排行榜。然后,您只需获取uid并从用户节点中查找名称即可。

就像其他海报所说的那样,使用HTTP Firebase Cloud Function和chron作业。

但是我建议您使用chron作业,以保持云功能保持活动状态(查找冷启动firebase函数),而且还每次用户玩游戏时都发出提取请求以从前端触发云功能并产生一个分数。否则,如果您每分钟获得10次播放,并且每分钟更新一次,那么对于那些希望获得实时排行榜的玩家来说,这并不是很好的用户体验。