MongoDB使用$and执行find查询时如何处理值为all的过滤条件
实现方案
核心思路是动态构建查询条件,对取值为all/any的参数直接跳过,不用加入过滤规则即可,以下是两种常用实现方式:
方式1:手动拼接条件数组(推荐,性能更好)
提前遍历所有参数,仅将需要过滤的条件加入数组,最后生成查询对象:
let { city, zanr, date } = req.body; const filterConditions = []; // 逐个判断参数是否需要加入过滤 if (city && city !== 'all' && city !== 'any') { filterConditions.push({ address: city }); } if (zanr && zanr !== 'all' && zanr !== 'any') { filterConditions.push({ type: zanr }); } if (date && date !== 'all' && date !== 'any') { filterConditions.push({ date: date }); } // 数组为空代表没有过滤条件,直接查询全量数据即可 const query = filterConditions.length ? { $and: filterConditions } : {}; const selectedEvent = await Events.find(query);
方式2:恒真条件占位(写法更简洁)
用MongoDB内置的恒真条件{ $expr: true }占位不需要过滤的字段,MongoDB执行时会自动忽略恒真条件:
let { city, zanr, date } = req.body; const selectedEvent = await Events.find({ $and: [ city && city !== 'all' && city !== 'any' ? { address: city } : { $expr: true }, zanr && zanr !== 'all' && zanr !== 'any' ? { type: zanr } : { $expr: true }, date && date !== 'all' && date !== 'any' ? { date: date } : { $expr: true } ] })
注意事项
- 注意判断参数的边界情况,比如参数为
undefined/null的场景,避免无效条件加入 - 你示例代码中写的
datum属于笔误,需要和你解构出来的date变量名保持一致,否则会抛出变量未定义错误 - 如果你的全选标识只有
all或者只有any,可以删掉判断逻辑里多余的校验规则
内容的提问来源于stack exchange,提问作者user8962037
相关产品推荐
相关产品推荐

