如何在Firebase云函数中解析用户评分数据并计算平均分?
Firestore云函数:解析评分字段并计算用户平均评分
你的代码无法提取「User rating」字段,核心原因是遍历QuerySnapshot时用错了方法——每个文档快照的字段数据需要通过doc.data()方法获取,而非doc.document属性。以下是修正后的完整代码,包含评分提取与平均值计算逻辑:
exports.onUserRatingUpdate = functions.firestore .document("user rating/{docId}") .onUpdate(async (change, eventContext) => { const snapData = change.after.data(); const userIdReceivingRating = snapData["User id getting rating"]; // 获取该用户的所有评分文档 const userRatingQuerySnapshot = await admin.firestore() .collection("user rating") .where("User id getting rating", "==", userIdReceivingRating) .get(); // 收集有效评分并计算平均值 let totalRating = 0; let validRatingCount = 0; userRatingQuerySnapshot.forEach(doc => { const ratingData = doc.data(); // 提取「User rating」字段,注意字段名需与Firestore中完全一致 const userRating = ratingData["User rating"]; // 校验评分有效性,避免非数字值干扰计算 if (typeof userRating === 'number' && !isNaN(userRating)) { totalRating += userRating; validRatingCount++; } }); // 计算平均值,处理无有效评分的边界情况 const averageRating = validRatingCount > 0 ? totalRating / validRatingCount : 0; // 可选:将平均值写入用户专属文档(示例为users集合下的对应文档) await admin.firestore() .collection("users") .doc(userIdReceivingRating) .update({ averageRating: averageRating }); console.log(`用户${userIdReceivingRating}的新平均评分为:${averageRating}`); });
关键修正说明:
- 用
doc.data()获取单篇文档的字段数据,再通过键名["User rating"]提取评分值 - 新增评分有效性校验,过滤非数字类型的无效评分
- 补充平均值计算逻辑,同时处理无有效评分时的除以0问题
- 可选添加将平均值写回用户文档的操作,匹配你计算新评分平均值的需求
内容的提问来源于stack exchange,提问作者user17281101
相关产品推荐
相关产品推荐

