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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:23:03