如何在Prisma+MongoDB中按日期(不含时间)分组日志数据?
按年月日分组MongoDB日志记录(Prisma实现方案)
一、推荐方案:用Prisma聚合操作实现日期分组
由于Prisma的groupBy仅支持按模型原生字段分组,无法直接对日期字段做截断/格式化处理,结合MongoDB的聚合管道是最直接的解决方式。通过$dateToString格式化日期为YYYY-MM-DD字符串,再以此为依据分组求和:
const logs = await db.log.aggregate([ { $addFields: { // 新增仅含年月日的字段作为分组键 dateOnly: { $dateToString: { format: "%Y-%m-%d", date: "$date" } } } }, { $group: { _id: "$dateOnly", totalCount: { $sum: "$count" } } }, { $sort: { _id: 1 } }, { // 重命名字段让结果更直观 $project: { _id: 0, date: "$_id", totalCount: 1 } } ]);
如果需要按日期对象而非字符串分组,可以用$dateTrunc截断到天:
const logs = await db.log.aggregate([ { $addFields: { dateOnly: { $dateTrunc: { date: "$date", unit: "day" } } } }, { $group: { _id: "$dateOnly", totalCount: { $sum: "$count" } } }, { $sort: { _id: 1 } } ]);
二、简化方案:新增日期字段
如果追求查询效率,可以在数据插入时额外存储一个仅含年月日的字段(如dateOnly),后续直接用Prisma的groupBy查询:
插入数据时维护字段
await db.log.create({ data: { date: new Date(), // 提取YYYY-MM-DD格式字符串 dateOnly: new Date().toISOString().split('T')[0], count: 1 } });
分组查询
const logs = await db.log.groupBy({ by: ["dateOnly"], _sum: { count: true }, orderBy: { dateOnly: "asc" } });
三、关于Prisma原生groupBy的限制
Prisma的groupBy目前不支持在by参数中使用计算表达式,只能基于模型定义的字段分组。因此如果直接按原始date字段分组,会因为时间部分的差异导致分组粒度太细,无法达到按天聚合的效果。
内容的提问来源于stack exchange,提问作者berki0
相关产品推荐
相关产品推荐

