我的问题是关于从数据库获取平均评级,然后每次添加一行时更新平均评级。 这是我在firebase中的数据库的结构。
我正在尝试检索每个ID的平均评分(数字,如299536),并在每次为同一个ID添加新数据/行时对其进行更新。 我正在使用Firebase实时数据库。 任何帮助表示赞赏。我正在使用react.js。我应该为此创建动作吗?
答案 0 :(得分:1)
如果我正确理解了您的问题-像这样:
database.ref(`movieinfo/${movieId}/avgRating`)
.once('value')
.then((snapshot) => {
const val = snapshot.val();
console.log(val);
})
.catch((e) => {
console.log('Error fetching data', e);
});
答案 1 :(得分:0)
我建议您从客户端抽象此逻辑,因为您可能拥有其他应用程序,并且打开avgRating供任何人更新不会使它值得信赖。您可以将Cloud Function触发器用于创建的每个评估,并在受信任的环境中运行您的逻辑,然后重新计算和更新解释创建函数的avgRating Heres a page from the docs
exports.calculateAvgRating = functions.database.ref('/moveinfo/{moveId}/{rating}')
.onCreate((snapshot, context) => {
// LOGIC GOES HERE e.g.
// Get a list of all your ratings
// Get average rating
// Update avgRating
}
答案 2 :(得分:0)
您可以使用云功能来执行此操作。让我们使用 onCreate 侦听器在每次写入时对总数进行平均。
export const ratingAvg = functions.database
.ref("ratings/{userId}/{recordId}")
.onCreate(async (snapshot, context) => {
const data = snapshot.val(); // rating obj (user, userPhoto, date, comment?, rating)
const userId = context.params.userId; // this is your userId
const transactionId = context.params.transactionId; // the uid of the record
const profileAvg = await admin
.database()
.ref(`ratings/${userId}/`)
.once("value");
//' if avgRating exists average with new rating else use new rating.
const newAvg = profileAvg.val().avgRating
? ((profileAvg.val().avgRating + data.rating) / 2).toFixed(2)
: data.rating;
// write new average
return admin
.database()
.ref(`ratings/${userId}/`)
.update({
avgRating: newAvg
})
.then(res => {
console.log(res);
})
.catch(err => {
console.log(err);
});
});