基于Mongoose的MongoDB通配符搜索:未传字段自动忽略方案
实现方案
下面提供3种无需手动逐个判断字段存在性的实现方式:
方案1:纯JS原生实现(无第三方依赖)
通过Object.entries过滤掉值为undefined的属性,自动生成合法查询条件,后续新增查询字段也无需修改逻辑:
async fetchStats(getStatQuery: GetStatQueryDto): Promise<any> { const query = Object.fromEntries( Object.entries(getStatQuery).filter(([_, value]) => value !== undefined) ); const stats = await this.statModel.find(query); return stats; }
方案2:基于lodash工具函数实现
如果项目已经引入lodash,写法更简洁易读:
import { omitBy, isUndefined } from 'lodash'; async fetchStats(getStatQuery: GetStatQueryDto): Promise<any> { const query = omitBy(getStatQuery, isUndefined); const stats = await this.statModel.find(query); return stats; }
方案3:Mongoose全局配置(最省事)
如果你使用的是Mongoose操作MongoDB,直接修改全局配置即可自动忽略所有查询中的undefined字段,原有业务代码完全不用改动:
- 在Mongoose初始化位置添加配置:
import mongoose from 'mongoose'; // Mongoose 6+ 版本默认strictQuery为true,改为false后会自动过滤查询条件中的undefined字段 mongoose.set('strictQuery', false);
- 原有代码保持不变即可生效:
async fetchStats(getStatQuery: GetStatQueryDto): Promise<any> { const stats = await this.statModel.find({ title: getStatQuery.title, weight: getStatQuery.weight }); return stats; }
内容的提问来源于stack exchange,提问作者Shobhit Tewari
相关产品推荐
相关产品推荐

