MongoDB通用聚合cases_total_date各日期键值的实现方案咨询
MongoDB 通用聚合:按日期键求和生成总统计文档
需求明确:现有MongoDB文档结构固定不可修改,每个文档包含cases_total_date字段——该字段的键是字符串格式的日期,值为对应统计数值。需要实现无需指定具体日期键的通用聚合逻辑,将所有文档中相同日期键的数值求和,最终输出account为total、包含各日期总和的cases_total_date文档。
聚合管道实现
db.collection.aggregate([ // 把cases_total_date的键值对转成数组,摆脱固定键的限制 { $addFields: { dateEntries: { $objectToArray: "$cases_total_date" } } }, // 展开数组,让每个日期-数值对成为独立文档 { $unwind: "$dateEntries" }, // 按日期分组,累加对应数值 { $group: { _id: "$dateEntries.k", total: { $sum: "$dateEntries.v" } } }, // 重组为{日期:总和}的键值对数组 { $group: { _id: null, cases_total_date: { $push: { k: "$_id", v: "$total" } } } }, // 把数组转成对象,添加account标识 { $project: { _id: 0, account: "total", cases_total_date: { $arrayToObject: "$cases_total_date" } } } ])
逻辑说明
$objectToArray:将cases_total_date对象拆分为[{k:日期, v:数值}, ...]的数组,实现动态处理所有日期键,无需提前指定任何具体日期。$unwind:展开数组,让每个日期-数值对单独成为文档,为后续分组求和做准备。- 第一次
$group:以日期(dateEntries.k)为分组键,对所有文档中该日期的数值求和。 - 第二次
$group:将所有日期的求和结果收集到一个数组中,方便后续转回对象格式。 $arrayToObject:把收集到的数组转回{日期:总和}的对象结构,还原cases_total_date的格式,同时添加account: "total"标识。
这个管道完全通用,无论cases_total_date里新增或减少日期键,都不需要修改聚合逻辑。
内容的提问来源于stack exchange,提问作者venv
相关产品推荐
相关产品推荐

