firebaseデータベースにリーダーボードがあります。 scoreとuserNameのルールを.indexOn
に設定しました。私はそれにレコードを追加し、トップ10を得る、これらは速く行くと簡単にクライアント側で達成される。ファンクションを使用してFirebaseデータベース内のノードの子供を注文する
しかし、現在のユーザーのランクを取得することは、クライアント側で実際には遅くなる可能性があります。リーダーボードノードの子の完全なリストを取得し、ユーザーレコードを見つけるまでレコードを数えなければならないからです...このリーダーボードは、その中に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の機能を学んでいます