如何在Mongoose中筛选日期重复/非重复文档并统计时长
MongoDB按日期分组并计算时长总和的聚合方案
核心聚合管道
db.collection.aggregate([ { $project: { // 将字符串格式的start、end转换为Date类型 startDate: { $toDate: "$start" }, endDate: { $toDate: "$end" }, // 提取日期部分(YYYY-MM-DD)作为分组键 date: { $dateToString: { format: "%Y-%m-%d", date: { $toDate: "$start" } } } } }, { $project: { date: 1, // 计算单条文档的时长(毫秒数) duration: { $subtract: ["$endDate", "$startDate"] } } }, { $group: { _id: "$date", // 求和每组的总时长 totalDuration: { $sum: "$duration" }, // 可选:保留组内所有文档的时长明细 durationDetails: { $push: "$duration" } } }, { // 可选:按日期倒序排列结果 $sort: { _id: -1 } } ])
阶段说明
- 第一阶段$project:将文档中字符串类型的
start和end转换为MongoDB可计算的Date类型,同时提取日期的YYYY-MM-DD部分作为后续分组的依据。 - 第二阶段$project:通过
$subtract计算单条文档的时长(单位:毫秒),MongoDB中日期类型相减会直接得到毫秒数差值。 - 第三阶段$group:以提取的
date作为分组键,用$sum累加每组内所有文档的时长,得到该日期的总时长;durationDetails字段为可选,用于保留组内每条文档的时长明细。 - 第四阶段$sort:可选阶段,按日期倒序排列结果,方便查看最新日期的数据。
结果示例
针对你提供的文档,执行后会得到如下结构的结果:
[ { "_id": "2023-02-05", "totalDuration": 10762, "durationDetails": [6333, 4429] }, { "_id": "2023-02-04", "totalDuration": 51614, "durationDetails": [34670, 56944] }, { "_id": "2023-02-03", "totalDuration": 17923, "durationDetails": [17923] } ]
内容的提问来源于stack exchange,提问作者user6684898
相关产品推荐
相关产品推荐

