需求

给定查询条件,聚合查询结果:按 sid 合并,gpuTimeelapsedTime 求和,date 取第一条(first)。

Mongosh 聚合命令(通用模板)

// 1) 把 query 替换成你的查询条件
// 2) 如需让 date 取“最早/最晚”,调整 $sort 的排序方向
const query = {
  // 例如:status: "OK",
  // date: { $gte: ISODate("2026-03-01T00:00:00.000Z") }
};

db.yourCollection.aggregate([
  { $match: query },

  // $first 依赖输入顺序:这里先按 date 排序,确保 first 是“最早的一条”
  { $sort: { sid: 1, date: 1 } },

  {
    $group: {
      _id: "$sid",
      date: { $first: "$date" },
      gpuTime: { $sum: "$gpuTime" },
      elapsedTime: { $sum: "$elapsedTime" },

      // 可选:保留合并后的条数
      count: { $sum: 1 }

      // 可选:如需保留其它字段,可以用 $first/$last 或 $push
      // someField: { $first: "$someField" },
      // items: { $push: "$$ROOT" }
    }
  },

  // 可选:把 _id 改回 sid 字段
  { $project: { _id: 0, sid: "$_id", date: 1, gpuTime: 1, elapsedTime: 1, count: 1 } },

  // 可选:最终排序
  { $sort: { sid: 1 } }
]);

示例 1:按日期范围过滤,date 取最早

const query = {
  date: {
    $gte: ISODate("2026-03-01T00:00:00.000Z"),
    $lt: ISODate("2026-03-02T00:00:00.000Z")
  }
};

db.task_log.aggregate([
  { $match: query },
  { $sort: { sid: 1, date: 1 } },
  {
    $group: {
      _id: "$sid",
      date: { $first: "$date" },
      gpuTime: { $sum: "$gpuTime" },
      elapsedTime: { $sum: "$elapsedTime" }
    }
  },
  { $project: { _id: 0, sid: "$_id", date: 1, gpuTime: 1, elapsedTime: 1 } }
]);

示例 2:date 取最新(last)

如果你想要 date 取最新的一条,把排序改成倒序,再用 $first:

db.task_log.aggregate([
  { $match: { status: "OK" } },
  { $sort: { sid: 1, date: -1 } },
  {
    $group: {
      _id: "$sid",
      date: { $first: "$date" },
      gpuTime: { $sum: "$gpuTime" },
      elapsedTime: { $sum: "$elapsedTime" }
    }
  }
]);