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

Swap rank in firebase realtime database using cloud function - Game

我有一个数据库,其中包含所有 users_ID 和 x_location。 我正在尝试从 Firebase 云函数中的 onUpdate() 触发方法中监听 x_location 更新并获取排名、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 云函数中的交换函数:

//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;
    });
 });

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

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