我想对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”值的平均值。
答案 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;
});
});