MongoDB按team字段参考ID分组求和指定数值字段实现问题
问题分析
你之前的写法存在三个核心问题:
- 分组键错误:
$group的_id设置为了$_id,也就是每个文档的唯一主键,会导致每个文档单独成为一个分组,无法实现按team ID聚合的效果 - 类型不匹配:你传入的ids是字符串格式,而MongoDB中存储的team字段值是ObjectId类型,直接用
$in匹配会因为类型不一致查不到对应数据 - 求和字段不全:只对points做了累加,没有处理其他需要求和的字段
正确实现方案
如果使用Mongoose操作MongoDB,完整实现代码如下:
// 引入ObjectId工具做类型转换 const { Types: { ObjectId } } = require('mongoose'); // 把字符串ID转为MongoDB识别的ObjectId类型 const ids = ['60c42acf6296623b00565153', '60c42acf6296623b00565154'].map(id => ObjectId(id)); TeamsDetails.aggregate([ // 筛选指定team的所有记录 { $match: { "team": { $in: ids } } }, // 按team字段分组,对需要的字段求和 { $group: { _id: "$team", // 保留组内第一条记录的_id、matchday,和你预期的输出结构对齐 originalId: { $first: "$_id" }, firstMatchday: { $first: "$matchday" }, goals_favor: { $sum: "$goals_favor" }, goals_against: { $sum: "$goals_against" }, goals_difference: { $sum: "$goals_difference" }, matches_played: { $sum: "$matches_played" }, won_matches: { $sum: "$won_matches" }, tied_matches: { $sum: "$tied_matches" }, lost_matches: { $sum: "$lost_matches" }, points: { $sum: "$points" } } }, // 调整字段名,匹配你期望的输出格式 { $project: { _id: "$originalId", team: "$_id", matchday: "$firstMatchday", goals_favor: 1, goals_against: 1, goals_difference: 1, matches_played: 1, won_matches: 1, tied_matches: 1, lost_matches: 1, points: 1 } } ]).exec((error, result) => { // 处理返回的聚合结果 })
如果你不需要保留原始文档的_id和matchday字段,可以删掉$project阶段,直接调整$group的字段逻辑即可。
内容的提问来源于stack exchange,提问作者Layynezz
相关产品推荐
相关产品推荐

