基于条件过滤的Mongoose聚合实现用户关联及平均评分计算
解决方案
你当前的代码没有完成过滤已删除反馈、关联User集合的逻辑,以下是可直接运行的完整聚合查询实现:
db.Recipe.aggregate([ // 第一步:过滤feedBack中未删除的有效反馈 { $addFields: { validFeedBack: { $filter: { input: "$feedBack", cond: { $eq: ["$$this.isDelete", false] } } } } }, // 第二步:关联User集合查询所有有效反馈对应的用户信息 { $lookup: { from: "User", localField: "validFeedBack.userId", foreignField: "id", as: "relatedUsers" } }, // 第三步:构造返回的结果字段 { $project: { // 构造带用户名的反馈详情数组 feedbackDetails: { $map: { input: "$validFeedBack", as: "fb", in: { id: "$$fb.id", time: "$$fb.time", rating: "$$fb.rating", review: "$$fb.review", isDelete: "$$fb.isDelete", // 从关联到的用户列表中匹配对应用户名 userName: { $getField: { input: { $first: { $filter: { input: "$relatedUsers", cond: { $eq: ["$$this.id", "$$fb.userId"] } } } }, field: "name" } } } } }, // 计算有效反馈的平均评分,没有有效反馈时返回0 averageRating: { $cond: { if: { $gt: [{ $size: "$validFeedBack" }, 0] }, then: { $avg: "$validFeedBack.rating" }, else: 0 } }, // 不需要返回_id字段可以保留本行,需要返回则删除 _id: 0 } } ])
代码说明
- 先通过
$filter提前过滤掉isDelete为true的无效反馈,避免后续做无用的关联查询 - 关联User集合时直接用所有有效反馈的userId批量查询,性能远高于逐行关联
- 构造feedbackDetails时通过二次过滤匹配对应反馈的用户名,保证数据对应关系准确
- 平均评分计算前先判断有效反馈长度,避免空数组计算时返回null的问题
内容的提问来源于stack exchange,提问作者Muhammad Yousuf
相关产品推荐
相关产品推荐

