给定查询条件,聚合查询结果:按 sid 合并,gpuTime 与 elapsedTime 求和,date 取第一条(first)。
// 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 } }
]);
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 } }
]);
如果你想要 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" }
}
}
]);