如何用Mongoose实现从创建日期起每30天筛选字典条目?
解决方案:每30天筛选MongoDB中的字典条目
要实现从条目创建日期开始每30天筛选出对应条目,你需要计算当前时间与条目created日期的时间差,判断差值是否为30天的整数倍。以下是两种可行方案:
方法1:聚合管道计算天数差取模
通过聚合管道计算当前日期与创建日期的天数差,再筛选出差值为30整数倍的条目:
const now = new Date(); const dicEntries = await dbs['en'].Dictionary.aggregate([ { $addFields: { daysDiff: { $floor: { $divide: [ { $subtract: [now, "$created"] }, 1000 * 60 * 60 * 24 // 毫秒转天数 ] } } } }, { $match: { $expr: { $and: [ { $eq: [{ $mod: ["$daysDiff", 30] }, 0] }, { $gte: ["$daysDiff", 30] } // 排除刚创建不足30天的条目 ] } } }, { $project: { daysDiff: 0 } } // 移除临时计算字段 ]);
方法2:精确匹配周期日期
如果需要严格匹配“创建日期加N×30天等于今天”的条目,可以重置日期到零点后做对比:
const now = new Date(); const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); // 重置到当天零点 const dicEntries = await dbs['en'].Dictionary.find({ $expr: { $eq: [ { $dateFromParts: { year: { $year: { $add: ["$created", { $multiply: [{ $mod: [{ $subtract: [today, "$created"] }, 30 * 86400000] }, 0] }] } }, month: { $month: { $add: ["$created", { $multiply: [{ $mod: [{ $subtract: [today, "$created"] }, 30 * 86400000] }, 0] }] } }, day: { $dayOfMonth: { $add: ["$created", { $multiply: [{ $mod: [{ $subtract: [today, "$created"] }, 30 * 86400000] }, 0] }] } } } }, today ] } });
方案说明
- 方法1适合宽松周期筛选,只要天数差为30的整数倍就会被选中;
- 方法2适合严格按日期触发的场景,仅匹配创建日期加整数倍30天后刚好是当天的条目;
- 若数据库与应用时区不一致,需先统一时区再进行计算。
内容的提问来源于stack exchange,提问作者user21189833
相关产品推荐
相关产品推荐

