如何在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
相关产品推荐
相关产品推荐

