使用云功能在 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 云功能:如何更新源节点?