如何使用MongoDB聚合器将对象列表按15分钟周期分组?
MongoDB 数组内元素按15分钟周期分组求和方案
要实现你要的效果,必须用MongoDB聚合管道,这是处理这类嵌套数组分组计算最直接高效的方式。下面是具体的实现步骤和完整代码:
核心聚合阶段拆解
- 展开数组:用
$unwind将values数组拆分为独立文档,让每个数组元素可以被单独处理 - 类型转换:把字符串格式的
timestamp转为日期类型,meterValue转为整数类型,否则无法进行时间分组和数值计算 - 15分钟分组:用
$dateTrunc将时间戳截断到15分钟的整数倍(如00:00、00:15、00:30),以此作为分组键 - 求和计算:对每个分组内的
meterValue求和 - 格式整理:将结果字段重命名为你需要的格式
完整聚合代码
db.yourCollectionName.aggregate([ // 展开values数组 { $unwind: "$values" }, // 转换数据类型并提取字段 { $addFields: { "values.timestamp": { $dateFromString: { dateString: "$values.timestamp" } }, "values.meterValue": { $toInt: "$values.meterValue" } } }, // 按15分钟周期分组,计算总和 { $group: { _id: { // 将时间截断到15分钟边界 fifteenMinPeriod: { $dateTrunc: { date: "$values.timestamp", unit: "minute", binSize: 15 } } }, meterValueSum: { $sum: "$values.meterValue" } } }, // 重命名字段,匹配期望输出格式 { $project: { _id: 0, date: "$_id.fifteenMinPeriod", meterValueSum: 1 } }, // 可选:按时间排序 { $sort: { date: 1 } } ])
结果说明
运行上述聚合后,会得到和你期望一致的输出:
{"date": "2022-01-01T00:15:00Z","meterValueSum": 39}, {"date": "2022-01-01T00:30:00Z","meterValueSum": 20}, {"date": "2022-01-01T00:45:00Z","meterValueSum": 17}
(注:MongoDB默认输出的日期会带时区标识Z,若需要去掉可以用$dateToString进一步格式化)
内容的提问来源于stack exchange,提问作者BryceSoker
相关产品推荐
相关产品推荐

