如何将MongoDB变量与通配符结合实现参数化查询
你写法运行失败的核心原因是,将正则规则拼接成了普通字符串,MongoDB查询时不会将包裹在引号里的"/xxx/"识别为正则表达式,只会作为完全匹配的普通字符串处理,因此无法命中符合包含规则的文档。
使用JavaScript原生的RegExp构造函数动态生成正则对象即可解决问题,以下是不同场景的实现代码:
场景1:保留原$in写法(适配后续多子串匹配需求)
key_sub_string = "2021-08-01_2021-08-11_Reported"; // RegExp第二个参数可传入匹配标志,如"i"代表忽略大小写,无特殊需求可省略 const matchRule = new RegExp(key_sub_string); db.getCollection('df_FI').find({ $and: [ {key:{"$in":[matchRule]}} ] })
场景2:仅需匹配单个子串(简化写法)
如果不需要同时匹配多个子串,可直接省略$in和$and,写法更简洁:
key_sub_string = "2021-08-01_2021-08-11_Reported"; db.getCollection('df_FI').find({ key: new RegExp(key_sub_string) })
注意事项
如果你的子串中包含正则特殊字符(如. * + ? ^ $ { } ( ) | [ ] \等),需要先对特殊字符做转义处理,避免出现正则语法错误,可调用以下工具函数转义:
// 正则特殊字符转义函数 function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } key_sub_string = "2021-08-01_2021-08-11_Reported"; const matchRule = new RegExp(escapeRegExp(key_sub_string)); db.getCollection('df_FI').find({ key: matchRule })
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

