在NestJS Mongoose中如何过滤字符串类型年份字段的数值范围
字符串类型年份字段的范围查询实现方案
针对MongoDB中字符串类型年份字段的范围查询需求,结合你的NestJS代码,提供两种可行实现方式:
方法一:利用字符串字典序直接匹配
由于存储的年份是固定4位数字字符串,其字典排序与数值排序完全一致,可直接用MongoDB的$gte(大于等于)和$lte(小于等于)操作符查询,无需类型转换,性能更优。
修改后的Service代码
如果需要动态接收起止年份参数,调整方法如下:
async getTestListWithYearFilter(startYear: number, endYear: number): Promise<Test[]> { return await this.testModel .find({ standard_year: { $gte: startYear.toString(), $lte: endYear.toString(), }, is_deleted: false, }) .exec(); }
若查询固定范围(如2020~2025),直接写死字符串值即可:
async getTestListWithYearFilter(): Promise<Test[]> { return await this.testModel .find({ standard_year: { $gte: '2020', $lte: '2025', }, is_deleted: false, }) .exec(); }
方法二:类型转换后数值范围匹配
如果年份字符串存在格式不统一的情况(如含前导零、非标准长度),可通过$expr结合$toInt操作符,将字符串转为整数后再做数值比较,兼容性更强。
修改后的Service代码
async getTestListWithYearFilter(startYear: number, endYear: number): Promise<Test[]> { return await this.testModel .find({ $expr: { $and: [ { $gte: [{ $toInt: '$standard_year' }, startYear] }, { $lte: [{ $toInt: '$standard_year' }, endYear] }, ], }, is_deleted: false, }) .exec(); }
两种方法对比
- 方法一:性能优异,若
standard_year字段创建了索引,查询可命中索引;仅适用于固定格式的数字字符串(如4位年份)。 - 方法二:兼容性强,无需依赖字符串格式;但因使用
$expr无法利用字段索引,数据量较大时查询性能会下降。
内容的提问来源于stack exchange,提问作者Jun
相关产品推荐
相关产品推荐

