MongoDB聚合查询:跨关联集合统计企业简历投递数
解决MongoDB跨集合统计企业简历投递数的方案
你的问题核心是跨集合关联数据,因为companyName属于JobPost集合,而Candidate集合仅存储了关联的job ID。需要通过聚合管道的$unwind+$lookup组合实现跨集合取数,再完成统计,具体方案如下:
正确的聚合查询代码
Candidate.aggregate([ // 1. 过滤存在appliedJobs且数组非空的候选人 { $match: { appliedJobs: { $exists: true, $ne: [] } } }, // 2. 展开appliedJobs数组,将每个投递记录拆分为独立文档 { $unwind: "$appliedJobs" }, // 3. 关联JobPost集合,获取每个投递对应的企业名称 { $lookup: { from: "JobPost", // 关联的集合名(需与实际集合名完全一致) localField: "appliedJobs.job", // Candidate集合中用于关联的字段 foreignField: "_id", // JobPost集合中匹配的字段 as: "jobDetails" // 关联结果存储的字段名 } }, // 4. 过滤掉关联失败的记录(比如对应的JobPost已被删除) { $match: { jobDetails: { $ne: [] } } }, // 5. 展开jobDetails数组($lookup默认返回数组,此处取唯一匹配项) { $unwind: "$jobDetails" }, // 6. 按企业名称分组,统计投递总数 { $group: { _id: "$jobDetails.companyName", count: { $sum: 1 } } }, // 7. 格式化输出字段,匹配你需要的表格格式 { $project: { _id: 0, Company: "$_id", Applications: { $concat: [{ $toString: "$count" }, " applications"] } } } ])
关键步骤说明
- $unwind appliedJobs:每个候选人可能投递多个岗位,展开数组后,每条文档对应一次独立投递,确保统计的是投递次数而非候选人数量。
- $lookup关联JobPost:通过
job字段的ObjectId匹配对应企业信息,解决跨集合取数的核心问题。 - 两次$unwind:第一次拆分投递记录,第二次处理
$lookup返回的数组结果(即使仅匹配一条数据,$lookup仍会返回数组)。 - $project格式化:将统计数值转换为"X applications"的字符串格式,并重命名字段以匹配你期望的表格结构。
注意事项
- 确认
from参数的值与JobPost集合的实际名称完全一致(MongoDB集合名区分大小写)。 - 若需保留空数组的候选人记录,可将
$unwind的preserveNullAndEmptyArrays设为true,但统计时需额外过滤无效数据。
内容的提问来源于stack exchange,提问作者margherita pizza
相关产品推荐
相关产品推荐

