MongoDB聚合中如何关联用户表按作者子字段分组统计帖子平均评分
问题原因
你当前代码无法运行的核心原因是:Mongoose 的 aggregate 管道不会自动处理关联字段的填充(populate),Post 集合中的 author 字段存储的是 User 文档的 ObjectId 而非完整用户数据,因此直接访问 $author.country.name 无法获取到对应值,必须先通过 $lookup 关联 User 集合拿到完整的作者信息。
正确实现代码
Post.aggregate([ // 第一步:按日期筛选符合条件的帖子 { $match: { "date": today } }, // 第二步:关联User集合,拉取作者完整信息 { $lookup: { from: "users", // 此处填User模型在MongoDB中的实际集合名,默认是模型名小写加s,即users localField: "author", // Post集合中存储的关联字段 foreignField: "_id", // User集合中对应的关联字段 as: "authorInfo" // 关联后存储作者信息的字段名 } }, // 第三步:$lookup返回的是数组,每个帖子只有一个作者,直接拆分数组为单个对象 { $unwind: "$authorInfo" }, // 第四步:按作者的国家、性别分组,统计平均评分 { $group: { _id: { country: "$authorInfo.country.name", gender: "$authorInfo.gender" }, avgRating: { $avg: "$rating" }, postCount: { $sum: 1 } // 可选配置,可额外统计每个分组的帖子数量 } } ]).then(function(res) { console.log(res) })
注意事项
- 如果你的 User 模型在 MongoDB 中的集合名不是默认的
users,需要把$lookup中的from字段替换为实际的集合名 - 如果你不需要同时按国家和性别分组,删除
_id中对应的字段即可 - 关联后如果需要过滤无效的作者数据,可以在
$unwind后再加一个$match筛掉authorInfo为空的文档
内容的提问来源于stack exchange,提问作者eneda
相关产品推荐
相关产品推荐

