Prisma aggregateRaw中created_at日期筛选失效问题求助
Prisma aggregateRaw $match 日期筛选返回空的解决方案
核心问题分析
- Prisma
aggregateRaw传递日期参数时,必须使用原生Date对象,而非ISO字符串——MongoDB的日期字段存储为Date类型,字符串格式的日期无法触发日期类型的匹配逻辑 - 需确认date-fns生成的日期范围边界是否精准(当年的起始/结束时间点是否完全覆盖目标数据)
- 确保数据库字段名与查询中完全一致(你的场景是
created_at,而非Prisma模型默认的createdAt)
具体修复步骤
用date-fns生成准确的当年日期边界
使用startOfYear和endOfYear生成严格覆盖全年的时间范围,避免边界遗漏:import { startOfYear, endOfYear } from 'date-fns'; const currentYearStart = startOfYear(new Date()); const currentYearEnd = endOfYear(new Date());在aggregateRaw中传递原生Date对象
不要将日期转为ISO字符串,直接传入Date对象到$match阶段:const result = await prisma.product_release.aggregateRaw({ pipeline: [ { $match: { created_at: { $gte: currentYearStart, $lte: currentYearEnd } } }, // 后续聚合阶段(如$group、$project等) ] });调试验证查询有效性
将生成的pipeline直接复制到MongoDB Compass的聚合查询面板中执行:- 如果Compass能返回数据,说明是Prisma参数传递的问题(比如误传字符串格式日期)
- 如果Compass也返回空,检查date-fns生成的日期范围是否正确,或数据库中
created_at字段的实际值是否真在范围内
额外注意事项
- Prisma 5.x的
aggregateRaw严格遵循MongoDB原生聚合语法,字段名必须与数据库存储完全一致,不要随意改成Prisma模型的驼峰命名 - 避免使用
toISOString()转换日期,MongoDB会将这类字符串视为普通文本,而非日期类型进行比较
内容的提问来源于stack exchange,提问作者Mezantrop
相关产品推荐
相关产品推荐

