0

私は、ユーザーが1から5までのビジネスを評価できるようにするアプリケーションを作成しています。私のアプリで使用する評価の平均を探しています。これまで私は現在、このコードでカウントを見ることしかできません。Firebaseデータベースのデータセットの平均を取る - Firebaseのクラウド機能

私は評価対象(randomValue:のInt)のすべての読み取り方法を見つけ出すのに苦労していますを。私はそれを配列に格納するのが最善であると考えていました。私はNodeにとってとても新しいので、私を許してください。

これについては、Firebird用のクラウド機能のドキュメントでは何も見つかりません。次のように

評価が保存されています。enter image description here

マイコード:

exports.scoreOneAverage = functions.database.ref('/ratings_average/{business_uid}/Score_1/{random}') 
.onWrite(event => { 
    const collectionRef = event.data.ref.parent; 
    const countRef = collectionRef.parent.child('count'); 

    // Return the promise from countRef.transaction() so our function 
    // waits for this async event to complete before it exits. 
    return countRef.transaction(current => { 
    if (event.data.exists() && !event.data.previous.exists()) { 
     return (current || 0) + 1; 

    } 
    else if (!event.data.exists() && event.data.previous.exists()) { 
     return (current || 0) - 1; 
    } 
    }).then(() => { 
    console.log('Counter updated.'); 
    List ratings = event.data.val(); 
    count = countRef.event.data.val(); 
    if(ratings === null) { 
      console.log('No ratings'); 
     } 
     else { 
      console.log("The average score is:" + count + ratings); 
     } 


    }); 
}); 

答えて

1

あなたはこの仕事をするために、わずかに調整する必要がありますトリガしているクラウド機能イベント。 B

docs on cloud functionsからのパスの仕様はどこでもその下に起こるの書き込みを含むパスに触れるすべての書き込みを、一致します。あなたがfoo /バー/としてあなたの関数のパスを設定した場合、それが一致して、これらの場所の両方に書き込みます:

/fooの/バー
/fooの/バー/バズ/本当に/深い/パス

だから、基本的には、これにアプローチする最良の方法は、このパス上の書き込みを聞くそうです:/ratings_average/{business_uid}/Score_1

あなたはまた、おそらく素晴らしいlodash図書館を利用したいと思う - それはあなたがを反復役立つ機能を持っていますjavascriptオブジェクト。あなたのfirebaseデータベースは一連のネストされたjson(配列の概念なし)として構築されているので、Score_1の値のようなデータのコレクションを反復処理するためには、オブジェクトを横断する必要があります。

// at the top of your file, 
import _ from 'lodash'; 
exports.scoreOneAverage = functions.database.ref('/ratings_average/{business_uid}/Score_1') 
    .onWrite(event => { 
    const scores = event.data.val(); 
    const avgSum = 0; 
    _.forOwn(scores, (scoreKey, scoreValue) => { 
     avgSum += scoreValue; 
    }); 
    const avg = avgSum/_.size(scores); // this is your average! Do with it what you like 
    }); 
を:以下は、私は

大雑把に出てコード化され、平均関数は次のようになりますに、我々は平均を取っているスコアの数を取得するために便利な lodash .forOwn() function、およびlodash .size()を使用しています

関連する問題