You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:27:02