我具有以下功能,该功能通过eanred_points对我的mobile_user表中的用户进行排名并为其分配等级。每当我调用http请求触发器时,都会执行此操作。
我要完成的工作是创建另一个名为排行榜的根节点,该根节点仅将前10位用户放在该节点中。
我当前的功能如下:
exports.leaderboardUpdate2 = functions.https.onRequest((req, res) =>{
var ref = admin.database().ref("/mobile_user");
ref.orderByChild("earned_points").once("value", function(dataSnapshot) {
var i = 0;
dataSnapshot.forEach(function(childSnapshot) {
var childRef = childSnapshot.ref;
var r = (dataSnapshot.numChildren() - i);
childRef.update({rank: r},function(error) {
if (error != null)
console.log("update error: " + error);
});
i++;
});
});
res.status(200).send("Updated mobile users ranks");
});
我将如何去做?任何帮助或建议,我们感激不尽。
答案 0 :(得分:0)
我可能会做这样的事情:
const LEADERBOARD_CUTOFF = 10;
exports.leaderboardUpdate2 = functions.https.onRequest((req, res) =>{
const updates = [];
const leaderboard = {};
const ref = admin.database().ref("/mobile_user");
const leaderboardRef = admin.database().ref("/leaderboard");
return ref.orderByChild("earned_points").once("value")
.then(dataSnapshot => {
let i = 0;
dataSnapshot.forEach(function(childSnapshot) {
const r = dataSnapshot.numChildren() - i;
updates.push(childSnapshot.ref.update({rank: r}));
if (r < LEADERBOARD_CUTOFF) {
leaderboard[childSnapshot.key] = Object.assign(childSnapshot.val(), {rank: r});
}
i++;
});
updates.push(leaderboardRef.set(leaderboard)));
return Promise.all(updates);
}).then(() => {
res.status(200).send("Updated mobile users ranks");
}).catch((err) => {
console.error(err);
res.status(500).send("Error updating ranks.");
});
});
与原始脚本的区别:
leaderboard
对象,并在发生迭代时对其进行适当填充。 set()
已添加到适当的引用上,作为函数中的最终更新。