gpt4 book ai didi

node.js - 使用函数对 Firebase 数据库中 Node 的子 Node 进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:16 24 4
gpt4 key购买 nike

我在 firebase 数据库中有一个排行榜。我已经为分数和用户名设置了 .indexOn 规则。我向其中添加记录,获得前十名,这些进展很快并且很容易在客户端实现。

但是在客户端检索当前用户的排名可能会变得非常慢,因为我必须获取排行榜 Node 的子 Node 的完整列表并计算记录,直到找到用户记录...这个排行榜最多可以获取 100k 条记录。更不用说这会带来巨大的网络流量。

我想在插入记录时使用 firebase 函数对记录进行排序和排名,这样我就可以保持尽可能低的网络流量。

我的结构是这样的:

"leaderboard": {
"user_id_xxxx":
{
"uid": "user_id_xxxx",
"userName" : "someone",
"score": 99999
"rank": 1
},
"user_id_xxxy":
{
"uid": "user_id_xxxy",
"userName" : "otherone",
"score": 99998
"rank": 2
}
}

所以我想出了一个代码片段,但我不知道如何订购它:

var functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var dbRef = functions.database.ref('/leaderboard');

exports.dbRefOnWriteEvent = dbRef.onWrite(event => {
const parentRef = event.data.ref.parent();
return parentRef.once('value').then(snapshot => {
var i = 1;
const updates = {};
snapshot.forEach(function(child) {
child.rank = i;
i++;
});
return parentRef.update(updates);
});
});

感谢任何建议和帮助,我仍在学习 Node.js 和 Firebase 函数

最佳答案

好吧,我明白了。下面的代码是第一个可行的解决方案。

var functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var dbRef = functions.database.ref('/leaderboard');
exports.dbRefOnWriteEvent = dbRef.onWrite(event => {
var ref = admin.database().ref("/leaderboard");

ref.orderByChild("score").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++;
});
});
});

您必须设置这样的索引规则才能使其正常工作:

"leaderboard": {
".indexOn": [ "/score", "/rank" ]
}

不知道为什么它需要斜杠字符,没有它就无法工作。

简短说明:我在排行榜中添加了一个 onWrite 触发器,每次更新时,forEach 都会运行并更新排名。它可以而且应该被优化,这个解决方案只是一个很好的起点。

关于node.js - 使用函数对 Firebase 数据库中 Node 的子 Node 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43370357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com