使用云功能在 Firebase 实时数据库中交换排名 - 游戏

Posted

技术标签:

【中文标题】使用云功能在 Firebase 实时数据库中交换排名 - 游戏【英文标题】:Swap rank in firebase realtime database using cloud function - Game 【发布时间】:2019-09-04 20:42:05 【问题描述】:

我有一个数据库,其中包含所有 users_ID 以及 rank 和 x_location。 我正在尝试监听 x_location 更新并从 Firebase 云函数中的onUpdate() 触发方法获取排名、x_location 和 user_ID。但是如何直接获取之前排名的用户详细信息来检查该用户的 x_location 是否小于当前用户的 x_location 以交换排名?

我有最终的方法来遍历所有用户以找到前面的排名用户并猜测变化,但我想知道一种更精确和优化的方法来实现这一点。遍历所有 user_ID 看起来很耗费内存。

我还要提到这个函数必须为多个用户更新运行,这可能是对大量数据的巨大处理。

对于当前场景,我只是收集更新用户的所有详细信息。

我的 Firebase 数据库快照:

users
 |- -kSjJSDFjl2DFc
 |        |- rank: 2
 |        |- x_location: 500
 |- -laoeSDFjfkdie
 |        |- rank: 1
 |        |- x_location: 600
 |
 So on...

我在firebase云功能中的swap功能:

//rank swap function
exports.swapRank = functions.database.ref('/users/userID').onUpdate(event => 
    var xVal = 0;   //updated user x_location
    var cxVal = 0;  //current preceding user x_location
    var rVal = 0;   //updated user rank
    var crVal = 0;  //current preceding user rank
    var uVal = event.params.userID;  //updated user_ID
    var cuVal = "";                  //current preceding user_ID
    return event.after.ref.once('value').then(snapshot => 
        snapshot.forEach(child => 
                if(child.key === 'x')      //updated user x_location
                    xVal = child.val();
                else if(child.key === 'r') //updated user rank
                    rVal = child.val();
        );

//*********************************************************************
        //preceding rank details collection needed here
        //cxVal,crVal,cuVal;
//*********************************************************************

        //To implement
        //if((crVal==(rVal-1)) & cxVal<xVal)
        //swap user ranks in firebase database;
    );
 );

【问题讨论】:

【参考方案1】:

假设您想将rank: 2 的用户与之前的玩家交换。您可以使用以下查询从数据库中获取它们:

firebase.database().ref("users").orderByChild("rank").endAt(2).limitToLast(2)

【讨论】:

感谢您这么快回答。从您的代码中得到一个想法,并按照link 的文档来解决我的问题。我不知道 Firebase 查询。没关系,我是云功能的新手(特别是 node.js)。

以上是关于使用云功能在 Firebase 实时数据库中交换排名 - 游戏的主要内容,如果未能解决你的问题,请参考以下文章

具有实时数据库触发器的 Firebase 云功能:如何更新源节点?

安排firebase云功能[重复]

验证 Firebase 云功能中的存储文件数据

javascript 用于连接DialogFlow和Firebase实时数据库的云功能

在云功能中使用 Cloud Firestore

Firebase 云功能不发送异步推送通知