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" } ] }]
需要实现两个核心逻辑:
- 筛选出
users数组中dueDate早于当前日期的对象 - 为筛选出的对象添加
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
相关产品推荐
相关产品推荐

