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

MongoDB跨集合统计:如何按Questions的标签统计答案数量

统计MongoDB中每个标签对应的答案数量

嘿,这个需求用MongoDB的聚合框架就能轻松实现,核心是把Answers和Questions两个集合关联起来,再按标签分组统计。我给你一步步说清楚:

前提说明

首先得确认你的Answers集合里有能关联到Questions的字段,比如每个答案文档都存了对应的问题ID(比如字段叫question_id,指向Questions集合的_id)——这是关联两个集合的关键哦。

具体聚合查询代码

直接上可运行的代码,我会逐行解释:

db.Answers.aggregate([
  // 1. 关联Questions集合,拉取对应问题的tags字段
  {
    $lookup: {
      from: "Questions",       // 要关联的目标集合
      localField: "question_id", // Answers中存问题ID的字段
      foreignField: "_id",    // Questions中的主键字段
      as: "question_info"     // 关联结果存储的字段名(数组类型)
    }
  },
  // 2. 展开question_info数组(每个Answer只对应一个Question,展开后变成单个对象)
  { $unwind: "$question_info" },
  // 3. 过滤掉没有tags的关联结果(避免统计无效数据)
  { $match: { "question_info.tags": { $exists: true, $ne: [] } } },
  // 4. 展开tags数组——把每个标签单独拆成一条记录,方便后续分组
  { $unwind: "$question_info.tags" },
  // 5. 按标签分组,统计对应的答案总数
  {
    $group: {
      _id: "$question_info.tags", // 分组依据:标签内容
      answer_count: { $sum: 1 }   // 统计每个标签的答案数量
    }
  },
  // 可选:按答案数量降序排列,快速看热门标签
  { $sort: { answer_count: -1 } }
])

代码步骤解释

  • $lookup:相当于SQL的左连接,把每个Answer对应的Question数据(主要是tags)拉进来,存在question_info字段里。
  • $unwind(第一次):因为$lookup返回的是数组(哪怕只有一条数据),所以用$unwind把它展开成单个对象,方便后续操作。
  • $match:过滤掉那些没有tags或者tags为空的记录,避免统计无效数据。
  • $unwind(第二次):把tags数组展开,比如一个问题有["Java", "Spring"]两个标签,展开后会变成两条记录,每条对应一个标签,这样就能单独统计每个标签的答案数了。
  • $group:按标签分组,用$sum:1统计每组的记录数,也就是该标签对应的答案总数。
  • $sort:可选步骤,按答案数量从多到少排序,方便快速查看热门标签。

注意事项

如果你的字段名和示例里的不一样(比如Answers中存问题ID的字段不是question_id),记得把代码里对应的字段名改成你实际使用的名称哦。

内容的提问来源于stack exchange,提问作者Teemo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:33:27