我想获取我的Firebase数据的平均值

时间:2019-03-30 16:20:08

标签: javascript firebase firebase-realtime-database google-cloud-functions

我想对FireBase中的数据更新时的相关值求平均值。

我正在使用Firebase函数,无法加载数据。 事件发生时我可以更改所需的数据,但无法计算数据的平均值。

exports.taverage = functions.database.ref('/User/tsetUser/monthQuit/{pushId}')
    .onCreate((snapshot, context) => {
        const promiseRoomUserList = admin.database().ref('/User/tsetUser/monthQuit/{pushId}').once('value');
        var sum=0;
        const arrayTime = [];
            snapshot.forEach(snapshot => {
               arrayTime.push('/User/tsetUser/monthQuit/{pushId}'.val());
            })
        for(let i=0; i<arrayTime.length; i++){
            sum+=arrayTime[i];
        }
        return admin.database().ref('/User/tsetUser/inform/standardQuit').set(sum);
    });

//我要设置“ standardQuit”值的平均值。

1 个答案:

答案 0 :(得分:0)

我不确定为什么无法计算平均值,但是您的代码的简单版本是:

exports.taverage = functions.database.ref('/User/tsetUser/monthQuit/{pushId}')
.onCreate((snapshot, context) => {
    return admin.database().ref('/User/tsetUser/monthQuit/{pushId}').once('value')
    .then(function(snapshot) {
        let sum=0;
        snapshot.forEach(child => {
            sum = sum + child.val();
        })
        let avg = sum / snapshot.numChildren();

        return admin.database().ref('/User/tsetUser/inform/standardQuit').set(avg);
    });
});

最大的区别:

  • 此代码从顶级和嵌套的then()返回承诺。这是必需的,因此Cloud Functions知道代码何时完成,从而可以停止向您收费(并有可能关闭容器)。

  • 我们只是将每个子代的值添加到总和中,因为您没有以其他任何方式使用数组。请注意,child.val()取决于您未共享的数据结构。因此,如果失败了,您将需要更新获取确切值的方式(或与我们共享数据结构)。

  • 该代码实际上通过将总和除以子节点数来计算平均值。


考虑使用移动平均线

要记住的一件事是,您现在每次添加一个节点时都读取所有节点。随着节点的添加,此操作将变得越来越昂贵。考虑是否可以使用移动平均线,该移动平均线不需要所有子节点,而仅需要当前平均线和新的子节点。该值将是一个近似平均值,而最近的值通常具有更大的权重,并且计算起来便宜得多:

exports.taverage = functions.database.ref('/User/tsetUser/monthQuit/{pushId}')
.onCreate((snapshot, context) => {
  return admin.database().ref('/User/tsetUser/inform/standardQuit').transaction(function(avg) {
    if (!avg) avg = 0;
    return (15.0 * avg + snapshot.val()) / 16.0;
  });
});