2017-06-10 5 views
7

私はこのデータベースをループして子値を取得するにはどうすればよいですか?

..ので、最初のキーは認証から取られたユーザーのuidあり、その後、彼/彼女が提供し、彼らはそれぞれの試合のために何をスコアでしたユーザ名も取られ、この enter image description here

のように見えた、このデータベースを持っています私は、各ユーザの合計ポイント取得したい

- 例えばレイ合計ポイントがとウッドで合計ポイントですが、ドキュメントのためにを見た後、私はやることができたすべてはただのためでした1人のユーザー、それぞれ書く必要がありますユーザー名と値を取得するための各行の特定の一致..今、彼らが何十人のユーザーであればどうなるか考えてみましょうか?うーんラインの多く..ここ

は、私は、レイの合計ポイントを表示できるようになるjavascriptのコード

var query = firebase.database().ref(); 
query.once("value") 
.then(function(snapshot) { 
snapshot.forEach(function(childSnapshot) { 

    var key = childSnapshot.key;  
    var Data1 = childSnapshot.child("Ray/Match1/Points").val(); 
    var Data2 = childSnapshot.child("Ray/Match2/Points").val(); 
    console.log(Data1 + Data2); 
    }); 
}) 

JSON

ではなく、木材のために明らかに私はそれを繰り返す必要がとそれを書く..

私はこれをどのように解決するのですか?

+0

これはfirebaseクラウド機能は、他のすべてのフロントエンドの実装をoutshines質問の種類は次のとおりです。ここではちょうどそれを達成するためのサンプルコードは、何か特別なFirebase機能、forループ-のちょうど良い古いJavaScriptを必要としません。 –

答えて

3

単に私が見ていた自分のDBへ

|_Id 
    |_ $userId: 
    |  |_ Ray 
    |  | |_ Match1:24 
    |  | |_ Match2:21 
    |  |_ total:45 

ノードを追加して、あなたがcloud functions

+0

すばらしい答えMohamed。私は変更を行い、マッチ結果とは別の合計スコアを格納するので、すべてのユーザーの合計スコアだけを取得することができます。だから/ 'TotalScores/$ uid/45' –

+0

それが私たちができる唯一の方法ですか?クラウド機能経由で?私は単純な静的なサイトを構築したいので、別の方法が必要ですか? – skyline33

+0

問題を解決する方法はいくつかあります。 しかし、私はバックエンド(あなたの場合は単純なノード関数)であなたのロジックを実装する方が便利だと思います。 また、データベースに一致を保存するたびに合計にポイントを追加することもできます。 –

5

を用いて全ノードを追加することができ、総

var query = firebase.database().ref(); 
query.once("value") 
.then(function(snapshot) { 
snapshot.forEach(function(childSnapshot) { 
    var total = childSnapshot.child("total").val(); 
    console.log(total); 
    }); 
}) 

user`s取得あなたの問題では、私はあなたのソリューションを持っていると思うし、少なくともあなたのソリューションへのパスウェイはあると思う。まず、基本的な問題について説明します。その後、いくつかの汎用コードを提供しようとします(私が使用した変数のいくつかを使用しようとします)。そして離れて行く!

は基本的に私は何を参照してください2つの段階...

STEP 1である - あなたは、自分の名前で新しいユーザーオブジェクトを作成する「コンストラクタ関数」(および/またはユーザID)を使用する必要があり、自分のプロパティのセット。

このような考え方では、コンストラクタ関数に「ユーザ名」、「マッチポイント1」、「マッチポイント2」などのプロパティを含めることができます。コンソールには、一致点1と2からの合計点を合計します。

ステップ2 - コンストラクタ関数が必要とするプロパティを指定するのに必要な特定のプロパティを探して、データベースを通過するループの内部にコンストラクタ関数を配置する必要がありますあなたが探している情報を吐き出す

だから、それはたくさんの言葉だったので、深呼吸しましょう...それをコード化しようとしましょう。私はあなた自身のプロパティ/変数名を簡単に挿入できるように、一般的なプロパティを使います。

var user = function(name, match1, match2){ 
    this.name = name; 
    this.match1 = match1; 
    this.match2 = match2; 
    this.pointTotal = function(match1, match2) { 
     console.log(match1 + match2);}; 
    this.summary = function(){ 
      console.log(name + " has a total of " + pointTotal + " 
points.");}; 
} 

コードのこの部分では、特定のものだけでなく、すべてのユーザー名を使用できます。

上記のコードは、問題のコンストラクタ関数の部分を処理します。今では、一意の名前で作成する必要があるユーザーの数は関係ありません。

次のステップでは、データベースを経由して各ユーザーを作成するのに必要なプロパティを入力する、何らかのループ関数を作成して、1人ではなくすべてのユーザーから合計ポイントを取得できるようにします。

繰り返しますが、私はジェネリックっぽいプロパティ/変数名を使用します...

var key = childSnapshot.key; 

while(i = 0; i < key.length + 1; i++) { 

    var user = function(name, match1, match2){ 
     this.name = name; 
     this.match1 = match1; 
     this.match2 = match2; 
     this.pointTotal = function(match1, match2) { 
      console.log(match1 + match2);}; 
     this.summary = function(){ 
      console.log(name + " has a total of " + pointTotal + " points.");}; 
    } 
} 

言葉の全体の多くで、コードは、一般的なプロパティ名/変数のハイブリッドであるとプロパティ名のその/あなたが使用している変数ですが、私は正しい経路にいると確信しています。

私が提供したコードと説明を使用した場合、独自の変数をプラグインすると、必要なソリューションが得られるという確信がたくさんあります。

私は本当に助けてくれると願っています。私が練習が必要なので、私は問題を解決するのを手伝っています。私はすぐに応答しない場合、私は幸運

:(私は私の仕事でありそうだ奇妙な時間とそうでジョブを作業しないと私は私が助けた!

+0

モハメッドのように見えます。私は自分の答えをリバースエンジニアリングして自分で理解できるようにします。ねえ...ブラボモハメド! :) –

+0

これを書く時間をとってくれてありがとう、あなたは私にjsonの例を見せてくれますか?このような意味ですか?https://jsonblob.com/f22313a3-4e29-11e7-ae4c-096d61fc72e0 – skyline33

+0

ちょっとスカイライン!残念ながら、私はまだjsonについての最初のことは知らないと言うのは恥ずかしいです。私はちょうどhtml、cssとjavascriptを知っていますが、私はjavascriptでかなり快適になっていて、あなたの問題でjavascriptを認識し、解決方法を見ました。 –

2

をこの実装をチェックしたいと考えています。クラウドのための必要性を全く機能。

firebase().database().ref().on('value', function(snapshot) { 
snapshot.forEach((user)=>{ 

    user.forEach((matches)=> { 
    var total = 0; 
    matches.forEach((match)=> {  
     total += match.val().Points;   
    }); 
    console.log(total);       
    });  

    }); 
}) 
+1

これは正しいですが、フロントエンドでループスルーする必要があるため最適ではありません。モハメドはアプリからロジックを隠しているので(より安全です)、より優れています。さらに、firebaseはnosqlデータベースです。ですから、最適なソリューションを得るためには、nosqlの観点からアプローチするほうがよいでしょう。 –

1

鍵はユーザーのIDであれば、なぜユーザーの名前のさらに別のネストされたオブジェクトを追加しますか?あなたは一人のユーザーが複数のユーザ名を持っていることを期待しますか?それは奇妙に聞こえると複雑さに加え、あなたのようにユーザ名をFirebaseのどこかに保存する必要がある場合は、ユーザの詳細を専用にすることをお勧めしますユーザーIDキーのすぐ下のどこかにある。ここでFirebaseオブジェクト構造のJavaScriptの表現です:

{ 
    a1230scfkls1240: { 
    userinfo: { 
     username: 'Joe' 
    }, 
    matches: { 
     asflk12405: { 
     points: 123 
     }, 
     isdf534853: { 
     points: 345 
     } 
    } 
    } 
} 

さて、合計ポイントに得ることがもう少し簡単なようで、それをしないのですか?

あなたの現在のデータベース構造を変更せずに手助けをするには、データベース内のすべてのuserId + username +一致順列をループするだけです。

const query = firebase.database().ref(); 

query.once('value') 
.then(snapshot => { 
    const points = {} 
    const users = snapshot.val() 

    for (const userId of Object.keys(users)) { 
    const userprofile = users[userId] 

    for (const username of Object.keys(userprofile)) { 
     const user = userprofile[username] 

     for (const matchId of Object.keys(user)) { 
     const match = user[matchId] 
     // Store the points per user, per profile, or per both, depending on your needs 
     points[username] = points[username] === undefined 
      ? points[username] = match.points 
      : points[username] += match.points 
     } 
    } 
    } 
}) 
関連する問題