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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:35:16