如何使用MongoDB聚合管道计算指定日期的周起止日期
用MongoDB聚合管道计算日期所在周的起止日期
针对你的price集合中带collection_date字段的文档(比如示例中的2022-12-01),可以通过MongoDB聚合管道配合日期操作符,快速算出该日期所在周的起始(2022-11-28)和结束日期(2022-12-04),以下是完整实现方案:
聚合管道脚本
db.price.aggregate([ // 保留原日期用于结果对比 { $addFields: { original_date: "$collection_date" } }, // 计算周起始日期(指定周一为周起始,适配示例结果) { $addFields: { week_start: { $dateTrunc: { date: "$collection_date", unit: "week", timezone: "Asia/Shanghai", // 根据业务时区调整 startOfWeek: "monday" } } } }, // 通过起始日期加6天得到周结束日期(周日) { $addFields: { week_end: { $dateAdd: { startDate: "$week_start", unit: "day", amount: 6 } } } }, // 可选:筛选只保留需要的输出字段 { $project: { original_date: 1, week_start: 1, week_end: 1, _id: 0 // 不需要的话可隐藏_id字段 } } ])
关键说明
$dateTrunc:按指定单位截断日期,这里用week单位,通过startOfWeek参数指定周一为周起始,完美匹配示例中2022-12-01对应周一为2022-11-28的结果;如果业务需要周日作为周起始,将startOfWeek改为sunday即可。$dateAdd:在周起始日期基础上叠加6天,直接得到周结束日期(周日)。- 时区参数
timezone:必须根据你的业务时区设置,避免跨时区导致日期计算偏差。
示例输出
针对collection_date: ISODate("2022-12-01T00:00:00Z")的文档,输出结果如下:
{ "original_date": ISODate("2022-12-01T00:00:00Z"), "week_start": ISODate("2022-11-28T00:00:00Z"), "week_end": ISODate("2022-12-04T00:00:00Z") }
内容的提问来源于stack exchange,提问作者psprogrammer
相关产品推荐
相关产品推荐

