如何从Firebase实时数据库获取平均值

时间:2018-11-11 23:11:14

标签: reactjs firebase firebase-realtime-database

我的问题是关于从数据库获取平均评级,然后每次添加一行时更新平均评级。 这是我在firebase中的数据库的结构。 Firebase Real-time Database structure

我正在尝试检索每个ID的平均评分(数字,如299536),并在每次为同一个ID添加新数据/行时对其进行更新。 我正在使用Firebase实时数据库。 任何帮助表示赞赏。我正在使用react.js。我应该为此创建动作吗?

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题-像这样:

database.ref(`movieinfo/${movieId}/avgRating`)
  .once('value')
  .then((snapshot) => {
    const val = snapshot.val();
    console.log(val);
  })
  .catch((e) => {
    console.log('Error fetching data', e);
  });

答案 1 :(得分:0)

我建议您从客户端抽象此逻辑,因为您可能拥有其他应用程序,并且打开avgRating供任何人更新不会使它值得信赖。您可以将Cloud Function触发器用于创建的每个评估,并在受信任的环境中运行您的逻辑,然后重新计算和更新解释创建函数的avgRating Heres a page from the docs

exports.calculateAvgRating = functions.database.ref('/moveinfo/{moveId}/{rating}')
    .onCreate((snapshot, context) => {
        // LOGIC GOES HERE e.g.
        // Get a list of all your ratings
        // Get average rating
        // Update avgRating
    }

答案 2 :(得分:0)

您可以使用云功能来执行此操作。让我们使用 onCreate 侦听器在每次写入时对总数进行平均。

export const ratingAvg = functions.database
 .ref("ratings/{userId}/{recordId}")
 .onCreate(async (snapshot, context) => {
 const data = snapshot.val(); // rating obj (user, userPhoto, date, comment?, rating)
 const userId = context.params.userId; // this is your userId
 const transactionId = context.params.transactionId; // the uid of the record

 const profileAvg = await admin
  .database()
  .ref(`ratings/${userId}/`)
  .once("value");

  //' if avgRating exists average with new rating else use new rating.
  const newAvg = profileAvg.val().avgRating
  ? ((profileAvg.val().avgRating + data.rating) / 2).toFixed(2)
  : data.rating; 

  // write new average
  return admin
   .database()
   .ref(`ratings/${userId}/`)
   .update({
     avgRating: newAvg
   })
   .then(res => {
     console.log(res);
   })
   .catch(err => {
     console.log(err);
   });
 });