我正在创建一个应用,允许用户为1到5的商家评分。我试图找到我的应用中使用的评分的平均值。到目前为止,我目前只能通过此代码查看计数。
我正在努力弄清楚如何阅读所有评级对象(randomValue: Int )。我认为最好将它们存储在一个数组中。我是Node的新手,请原谅我。
我在Cloud Functions for Firebase文档中找不到任何关于此内容的内容。
我的代码:
exports.scoreOneAverage = functions.database.ref('/ratings_average/{business_uid}/Score_1/{random}')
.onWrite(event => {
const collectionRef = event.data.ref.parent;
const countRef = collectionRef.parent.child('count');
// Return the promise from countRef.transaction() so our function
// waits for this async event to complete before it exits.
return countRef.transaction(current => {
if (event.data.exists() && !event.data.previous.exists()) {
return (current || 0) + 1;
}
else if (!event.data.exists() && event.data.previous.exists()) {
return (current || 0) - 1;
}
}).then(() => {
console.log('Counter updated.');
List ratings = event.data.val();
count = countRef.event.data.val();
if( ratings === null ) {
console.log('No ratings');
}
else {
console.log("The average score is:" + count + ratings );
}
});
});
答案 0 :(得分:2)
您要触发的云功能事件应略微调整以使其正常工作。乙
路径规范匹配触摸路径的所有写入,包括发生在其下方任何位置的写入。如果将函数的路径设置为/ foo / bar,则它会匹配以下两个位置的写入:
/富/酒吧
/富/酒吧/巴兹/真/深/路径
基本上,处理此问题的最佳方法是听取此路径上的写入:/ratings_average/{business_uid}/Score_1
你也可能想要利用这个梦幻般的lodash库 - 它有一些功能可以帮助你迭代一个javascript对象。因为您的firebase数据库是一系列嵌套的json(没有数组概念),所以您需要遍历对象以迭代任何数据集合,例如Score_1的值。下面,我使用方便的 lodash .forOwn() function和lodash .size()来获取我们平均得分的数量
大致编码,平均函数看起来像这样:
// at the top of your file,
import _ from 'lodash';
exports.scoreOneAverage = functions.database.ref('/ratings_average/{business_uid}/Score_1')
.onWrite(event => {
const scores = event.data.val();
const avgSum = 0;
_.forOwn(scores, (scoreKey, scoreValue) => {
avgSum += scoreValue;
});
const avg = avgSum / _.size(scores); // this is your average! Do with it what you like
});