Node.js操作MongoDB类SQL LIKE模糊查询动态传参失效问题
MongoDB动态参数模糊查询失效解决方案
问题复现
- 静态写死正则文本时查询正常,使用模板字符串拼接用户输入的写法无法返回预期结果,失效写法如下:
{ "title": /${req.body.search}/i }
- 需求是实现类似SQL中
%LIKE%的效果,支持根据前端传入的用户输入动态做模糊匹配。
问题根因
正则字面量写法(即/xxx/包裹的写法)不会解析内部的模板字符串插值,上述写法最终生成的正则会直接匹配字面量内容${req.body.search},而非变量实际存储的用户输入值,因此动态传参时查询失效。
可行实现方案
方案1:通过RegExp构造函数生成动态正则
使用JS原生RegExp构造函数传入动态字符串生成正则实例即可实现动态匹配,注意提前转义用户输入中的正则特殊字符,避免输入. * + ? ^ $ { } ( ) | [ ] \这类字符时触发正则语法错误:
// 正则特殊字符转义工具方法 const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const searchKey = escapeRegExp(req.body.search); const query = { title: new RegExp(searchKey, 'i') // 第二个参数'i'代表不区分大小写匹配 }; // 传入query执行正常查询即可
方案2:使用MongoDB官方$regex操作符
用MongoDB原生提供的$regex操作符写查询,语义更明确,同样支持动态传参和匹配配置:
const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const searchKey = escapeRegExp(req.body.search); const query = { title: { $regex: searchKey, $options: 'i' } };
性能提示:如果集合数据量较大,务必给需要做模糊匹配的字段建立索引;如果是多字段、多语言的复杂搜索场景,优先使用MongoDB自带的全文索引能力,正则匹配的全表扫描性能无法支撑大数据量场景。
内容的提问来源于stack exchange,提问作者Sachin Shah
相关产品推荐
相关产品推荐

