javascript - 对 Firebase 数据库中的数据集取平均值

标签 javascript firebase firebase-realtime-database

我正在设计一个应用程序,但对 Javascript 有点不适应。到目前为止,我有一个具有以下结构的 Firebase 实时数据库。[! enter image description here

我想做的是每次添加/更新绿色区域时,从该绿色区域中获取一个值(红色),从每个绿色对象中保存的所有值中获取平均值并放置它变成底部的棕色物体。

有人知道如何使用 Javascript/Firebase 函数完成此操作吗?

JSON 导出:

{
  "5Rz8DpU34PeXAcnriD6vEiPu7jk2" : {
    "UiWK7RkdeCbUte8g7naB9qp42qu1" : {
      "rating1" : 5
    },
    "average" : 0
  },
  "Fi43uP2LcbVLi2uFwUyCAp2uvSH2" : {
    "average" : 0
  },
  "UiWK7RkdeCbUte8g7naB9qp42qu1" : {
    "Fi43uP2LcbVLi2uFwUyCAp2uvSH2" : {
      "rating1" : 5,
      "rating2" : 5
    },
    "asdas" : {
      "rating1" : 2
    },
    "average" : 0
  },
  "gov4hRpDgDVhyVgsQrYJnn1rfeW2" : {
    "UiWK7RkdeCbUte8g7naB9qp42qu1" : {
      "rating1" : 5
    },
    "average" : 0
  }
}

最佳答案

以下 Cloud Function 代码应该可以解决问题:

const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.database();

exports.average = functions.database
  .ref('/ratings/{blueId}/{greenId}')
  .onWrite((change, context) => {
    const blueId = context.params.blueId;
    const blueRef = db.ref('ratings/' + blueId);

    const blueAverageRef = db.ref('ratings/' + blueId + '/average');

    let totalSum = 0;
    let nbrOfElem = 0;

    return blueRef
      .once('value', function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
          if (childSnapshot.val().val) {
            //console.log(childSnapshot.val());
            totalSum += childSnapshot.val().val;
            nbrOfElem++;
          }
        });
      })
      .then(() => {
        //console.log('totalSum: ' + totalSum);
        //console.log('nbrOfElem: ' + nbrOfElem);
        return blueAverageRef.transaction(function(average) {
          if (nbrOfElem > 0) {
            return { val: totalSum / nbrOfElem };
          } else {
            return 0;
          }
        });
      })
      .catch(error => {
        console.log(error);
      });
  });

请注意,它使用了一个事务,请参阅 https://firebase.google.com/docs/database/web/read-and-write#save_data_as_transactionshttps://firebase.google.com/docs/reference/js/firebase.database.Reference#transaction

数据库的结构应为:

-ratings
   -blueNode1
      -greenNode11
         -val:2  // <- red node in your picture
      -greenNode12
         -val:10
      -average   // <- red node in your picture
         -val:6
   -blueNode2
      -greenNode21
         -val:5
      -greenNode22
         -val:3
      -greenNode23
         -val:1
      -average
         -val:5

关于javascript - 对 Firebase 数据库中的数据集取平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51536248/

相关文章:

ios - Firebase RemoveObserver 方法不会删除观察者

javascript - 选择接触视口(viewport)顶部边缘的元素的有效方法

javascript - 如何仅在存在 DOM 元素时加载 Angular2 应用程序

php - 为什么我的电子邮件地址字段没有像我希望的那样显示在我的单选按钮右侧?

swift - 无法访问存储在实时数据库中的对象

arrays - firebase swift 观察者之外的空数组

javascript - 坚持在 JavaScript 中递增日期

ios - 未经身份验证的用户名测试数据库 [Firebase/Swift 3]

ios - Firebase 是否仍支持 Mac OS X - 2016 年 7 月

swift - Firebase 数据结构