Prisma+JS如何直接查询早于1小时的记录 无需后置过滤
Prisma 直接查询早于1小时的时间字段记录实现方案
你当前采用先查询全量匹配基础条件的记录、再在内存中用filter过滤过期数据的方式,在表数据量较大时会产生不必要的性能开销,完全可以通过Prisma原生的查询条件在数据库层直接完成过滤,无需后置处理。
核心实现逻辑
直接计算出当前时间往前推1小时的时间阈值,在where条件中通过Prisma内置的时间比较操作符做筛选即可:
- 同层级查询条件默认是
AND关系,无需额外包裹AND数组 - 用
lt(less than,小于)操作符匹配reservedAt早于阈值的记录 - Prisma会自动处理JS Date对象和数据库时间类型的转换,生成对应数据库适配的SQL
最终查询代码
// 生成1小时前的时间阈值 const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000); const expiredReservation = await prisma.collectionIndexes.findMany({ where: { collectionId: dbCollection.id, submitedTx: null, reservedAt: { lt: oneHourAgo } }, orderBy: { reservedAt: 'asc' } })
逻辑等价说明
这个写法和你原有内存过滤的逻辑完全一致:
原有判断逻辑addHours(r.reservedAt, 1).getTime() < new Date().getTime(),等价于r.reservedAt.getTime() < Date.now() - 1*60*60*1000,和数据库层的reservedAt < oneHourAgo判断完全匹配,不会出现结果偏差。
内容的提问来源于stack exchange,提问作者dzCodes
相关产品推荐
相关产品推荐

