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
相关产品推荐
相关产品推荐

