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

MongoDB数据处理:过滤数组对象并添加逾期罚款属性

解决MongoDB文档筛选与逾期罚款计算问题

场景与需求

从MongoDB获取的文档存储在books变量中,结构示例如下:

const books = [{
    "users": [
        {
            "id": "1",
            "dueDate": "2023-01-06T07:28:42.461Z"
        },
        {
            "id": "2",
            "dueDate": "2023-01-08T07:34:46.095Z"
        }
    ]
}]

需要实现两个核心逻辑:

  1. 筛选出users数组中dueDate早于当前日期的对象
  2. 为筛选出的对象添加fine属性,计算规则为每逾期1天罚款100卢比(fine = 逾期天数 × 100)

现有代码仅能完成筛选,但无法添加fine字段,需要调整实现逻辑。

解决方案

方案1:filter + map 组合(直观易读)

// 缓存当前日期,避免重复创建实例
const currentDate = new Date();

books.forEach(book => {
  book.users = book.users
    // 第一步:筛选逾期用户
    .filter(user => new Date(user.dueDate) < currentDate)
    // 第二步:为每个逾期用户计算并添加fine属性
    .map(user => {
      const dueDate = new Date(user.dueDate);
      // 计算逾期天数,向上取整确保不足一天也按一天计算
      const overdueDays = Math.ceil((currentDate - dueDate) / (1000 * 60 * 60 * 24));
      // 扩展原对象,添加fine字段
      return { ...user, fine: overdueDays * 100 };
    });
});

方案2:reduce 合并操作(性能更优)

如果处理的数据量较大,用reduce可以减少一次数组遍历,同时完成筛选和属性添加:

const currentDate = new Date();

books.forEach(book => {
  book.users = book.users.reduce((resultList, user) => {
    const dueDate = new Date(user.dueDate);
    if (dueDate < currentDate) {
      const overdueDays = Math.ceil((currentDate - dueDate) / (1000 * 60 * 60 * 24));
      resultList.push({ ...user, fine: overdueDays * 100 });
    }
    return resultList;
  }, []);
});

关键说明

  • 不要直接用字符串日期比较:user.dueDate < new Date().toISOString()虽然能工作,但字符串比较依赖格式一致性,转为Date对象比较更可靠。
  • 逾期天数计算:用时间差除以一天的毫秒数(1000*60*60*24),并通过Math.ceil向上取整,确保哪怕逾期1小时也按1天计算罚款。
  • 缓存当前日期:避免在循环中重复创建new Date(),提升代码性能。

内容的提问来源于stack exchange,提问作者Roshan Shetty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:05:41