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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:25:28