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

如何在MongoDB中对嵌套日期范围内的值求和

MongoDB聚合计算指定日期范围数值总和

嘿,这就给你写出符合需求的MongoDB聚合命令,还会拆解每个步骤的作用~

首先咱们的核心思路是:把days字段的键值对转成可遍历的数组,筛选出目标日期区间的条目,最后对数值求和。下面是完整的聚合命令:

db.collection.aggregate([
  // 第一步:把days对象转成[{k: 日期字符串, v: 数值}]的数组
  {
    $addFields: {
      dayEntries: { $objectToArray: "$days" }
    }
  },
  // 第二步:过滤出2018年6月1日至30日的条目
  {
    $addFields: {
      juneEntries: {
        $filter: {
          input: "$dayEntries",
          cond: {
            $and: [
              { $gte: ["$$this.k", "2018-06-01"] },
              { $lte: ["$$this.k", "2018-06-30"] }
            ]
          }
        }
      }
    }
  },
  // 第三步:计算总和并整理输出格式
  {
    $project: {
      _id: 1,
      June_Sum: { $sum: "$juneEntries.v" }
    }
  }
])

步骤拆解:

  • 第一阶段$addFields:MongoDB没法直接遍历对象的键值对,所以用$objectToArray把days转换成数组格式,每个元素包含日期(k字段)和对应数值(v字段);
  • 第二阶段$addFields:用$filter筛选出日期在2018-06-01到2018-06-30之间的条目。这里因为日期是YYYY-MM-DD格式的字符串,直接用$gte和$lte做字典序比较就完全没问题;
  • 第三阶段$project:保留原始文档的_id,然后用$sum对筛选后的所有数值求和,得到June_Sum字段,正好匹配你要的输出格式。

如果某些文档里没有days字段,或者6月没有任何数据,$sum会自动返回0,不会报错哦~

内容的提问来源于stack exchange,提问作者McCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:49