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

MongoDB按team字段参考ID分组求和指定数值字段实现问题

问题分析

你之前的写法存在三个核心问题:

  1. 分组键错误:$group的_id设置为了$_id,也就是每个文档的唯一主键,会导致每个文档单独成为一个分组,无法实现按team ID聚合的效果
  2. 类型不匹配:你传入的ids是字符串格式,而MongoDB中存储的team字段值是ObjectId类型,直接用$in匹配会因为类型不一致查不到对应数据
  3. 求和字段不全:只对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 20:24:04