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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:38:13