Prisma双字段分组后重复PlantName问题及日期处理需求
问题分析与修正方案
核心错误点
分组后未合并同工厂数据
你当前按PlantName+OrderDate分组,同一个工厂的每日记录会生成独立分组结果。直接用map遍历分组时,每个分组都会输出一个带PlantName的对象,自然出现重复条目。字段映射错误
代码里写的PlantName: agg.Plant是错误的,分组字段是PlantName,应该改为agg.PlantName,否则会导致字段值异常。未处理OrderDate的时间部分
如果OrderDate包含时间戳,同日期不同时间的记录会被当成不同分组,必须先提取纯日期再进行分组。
修正后的代码
第一步:按纯日期+PlantName完成分组
如果使用ORM(如Prisma),直接在分组时用数据库函数提取日期部分;如果是纯JS处理,后续格式化时统一日期格式:
// 按PlantName和纯日期分组(数据库层面处理时间) const ordersWithAggregations = db.Orders.groupBy({ by: ['PlantName', db.fn.date(db.Orders.OrderDate)], // 提取OrderDate的纯日期部分 where: { PlantName: { in: plantNames }, OrderDate: { gte: fromDate, lte: toDate } }, _sum: { TotalPrice: true }, orderBy: { OrderDate: 'asc' } }); // 合并同Plant的每日数据,避免重复PlantName const plantDataMap = new Map(); ordersWithAggregations.forEach(agg => { const plantName = agg.PlantName; const formattedDate = format(new Date(agg.OrderDate)); // 确保日期格式统一 const totalPrice = agg._sum.TotalPrice || 0; // 初始化Plant数据结构 if (!plantDataMap.has(plantName)) { plantDataMap.set(plantName, { PlantName: plantName, data: [] }); } // 将当日数据追加到对应Plant的data数组 plantDataMap.get(plantName).data.push({ date: formattedDate, grandTotalPrice: totalPrice }); }); // 转换为目标格式数组 const result: IDataVisualize[] = Array.from(plantDataMap.values());
关键修正说明
- 用Map聚合同Plant数据:借助
Map的键唯一性,确保每个工厂只生成一个对象,所有日期的总和数据都放到该对象的data数组中。 - 修正字段映射:将
agg.Plant改为agg.PlantName,匹配分组时的字段名。 - 统一日期格式:无论是数据库层面提取纯日期,还是代码里格式化,都要确保同一天的记录被归为同一组,避免因时间戳差异导致的分组错误。
内容的提问来源于stack exchange,提问作者Dan Hunex
相关产品推荐
相关产品推荐

