【问题标题】:I want to get the average my firebase data我想获得我的 Firebase 数据的平均值
【发布时间】:2019-03-30 16:20:07
【问题描述】:

我想在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'值设置平均值。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 错误:Reference.set 失败:第一个参数在 validateFirebaseData (/user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist) 的属性“User.tsetUser.inform.standardQuit”中包含 NaN /index.node.cjs.js:1452:15) 在 validateFirebaseDataArg (/user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/index.node.cjs.js:1430:5) 在 Reference.set (/user_code/node_modules/firebase- 没有写sum的时候报了一个没有发生的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2015-09-11
    相关资源
    最近更新 更多