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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:13:09