
本文介绍如何通过 Mongoose 的 aggregate() 方法,基于 state 字段对职位文档进行分组计数,高效生成按州聚合的职位数量数据,适用于 US 热力图等可视化场景。
本文介绍如何通过 mongoose 的 `aggregate()` 方法,基于 `state` 字段对职位文档进行分组计数,高效生成按州聚合的职位数量数据,适用于 us 热力图等可视化场景。
在构建地理可视化(如美国各州职位热力图)时,后端需提供结构清晰、按州(state)分组的计数结果。Mongoose 原生查询无法直接实现“按字段值分组并统计数量”,此时应使用 Aggregation Pipeline(聚合管道) —— 它是 MongoDB 处理此类分析型查询的标准且高性能方案。
核心操作是 $group 阶段:以 state 字段为分组键(_id: "$state"),并用 $sum: 1 对每条匹配文档累加计数。完整示例代码如下:
const jobCountsByState = await Job.aggregate([
{
$group: {
_id: "$state",
count: { $sum: 1 }
}
},
{
$project: {
_id: 0,
state: "$_id",
count: 1
}
}
]).exec();✅ 输出格式与需求完全一致:
[ { "state": "FL", "count": 27 }, { "state": "NC", "count": 41 } ]
说明:
- 第一阶段
$group按state分组并计数,_id自动承载州名; - 第二阶段
$project重命名字段:将_id映射为state,排除原始_id(设_id: 0),保留count,使结果更语义化、易消费; - 若需仅返回
Available状态的职位,可在$group前添加$match阶段:{ $match: { status: 'Available' } }
⚠️ 注意事项:
- 确保
state字段在数据库中格式统一(如全大写"CA",而非"ca"或"California"),否则同州会被拆分为多组;建议在保存时标准化(如toUpperCase()); - 若数据量较大(>10万),建议为
state字段添加索引以加速聚合:Job.index({ state: 1 }); - 聚合结果默认无序,如需按州名或数量排序,可追加
$sort阶段(例如{ $sort: { count: -1 } })。
该方案单次查询即可完成全部统计,避免多次 countDocuments() 调用,兼具简洁性、可扩展性与生产可用性。

















