如何将PostgreSQL查询改写为NestJS/Sequelize风格的查询语句
直接对应原SQL的转换方案
提前导入Sequelize内置工具:
import { Op, fn, literal } from 'sequelize';
查询代码如下:
const currentMonthMovieCount = await this.moviesSchema.count({ where: { ownerId: 3, [Op.and]: [ // 匹配创建时间年份为当前年 sequelize.where( fn('EXTRACT', literal('YEAR FROM "createdAt"')), fn('EXTRACT', literal('YEAR FROM NOW()')) ), // 匹配创建时间月份为当前月 sequelize.where( fn('EXTRACT', literal('MONTH FROM "createdAt"')), fn('EXTRACT', literal('MONTH FROM NOW()')) ) ] } });
可选性能优化方案
如果你的createdAt字段建有索引,使用EXTRACT函数会触发全表扫描导致索引失效,可以改用时间区间判断的写法,查询效率更高:
const now = new Date(); // 当月第一天零点 const monthStart = new Date(now.getFullYear(), now.getMonth(), 1); // 下月第一天零点 const nextMonthStart = new Date(now.getFullYear(), now.getMonth() + 1, 1); const currentMonthMovieCount = await this.moviesSchema.count({ where: { ownerId: 3, createdAt: { [Op.gte]: monthStart, [Op.lt]: nextMonthStart } } });
内容的提问来源于stack exchange,提问作者SHEZOID
相关产品推荐
相关产品推荐

