2017-04-12 6 views
1

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の機能を学んでいます

答えて

0

私はそれを理解しました。以下のコードは、最初の作業ソリューションです。

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が更新されて更新されます。それは最適化することができ、最適化する必要があります。このソリューションは単なる良い出発点です。

関連する問題