获取Firebase数据库中的数据集的平均值 - Firebase的云功能

时间:2017-05-22 13:35:08

标签: node.js firebase firebase-realtime-database google-cloud-functions

我正在创建一个应用,允许用户为1到5的商家评分。我试图找到我的应用中使用的评分的平均值。到目前为止,我目前只能通过此代码查看计数。

我正在努力弄清楚如何阅读所有评级对象(randomValue: Int 。我认为最好将它们存储在一个数组中。我是Node的新手,请原谅我。

我在Cloud Functions for Firebase文档中找不到任何关于此内容的内容。

评级存储如下: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 个答案:

答案 0 :(得分:2)

您要触发的云功能事件应略微调整以使其正常工作。乙

来自docs on cloud functions

  

路径规范匹配触摸路径的所有写入,包括发生在其下方任何位置的写入。如果将函数的路径设置为/ foo / bar,则它会匹配以下两个位置的写入:

     

/富/酒吧
   /富/酒吧/巴兹/真/深/路径

基本上,处理此问题的最佳方法是听取此路径上的写入:/ratings_average/{business_uid}/Score_1

你也可能想要利用这个梦幻般的lodash库 - 它有一些功能可以帮助你迭代一个javascript对象。因为您的firebase数据库是一系列嵌套的json(没有数组概念),所以您需要遍历对象以迭代任何数据集合,例如Score_1的值。下面,我使用方便的 lodash .forOwn() functionlodash .size()来获取我们平均得分的数量

大致编码,平均函数看起来像这样:

// 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
  });