如何用MongoDB实现SQL LIKE等效查询?我的代码为何不生效?
问题分析与修复方案
核心错误
你当前代码的问题在于正则表达式写法错误:
/req.query.Product_Name/是把req.query.Product_Name当成了字面量字符串,而非读取变量的值。MongoDB会去匹配Product_Name字段严格等于req.query.Product_Name的文档,自然找不到Test Product (22in)。
修复代码
要实现输入Test Product匹配到包含该字符串的产品,需要动态创建正则表达式,正确读取用户的搜索关键词:
let collection = database.collection('Product') // 提取用户的搜索关键词 const searchKeyword = req.query.Product_Name // 动态生成正则,匹配包含关键词的内容,'i'可选,用于不区分大小写匹配 const doc = await collection.find({ "Product_Name": new RegExp(searchKeyword, 'i') }).toArray() console.log(doc)
额外优化(可选)
如果用户的搜索关键词可能包含正则特殊字符(比如.、*、?、(等),需要先转义这些字符,避免正则语法异常:
// 正则特殊字符转义函数 function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') } let collection = database.collection('Product') const searchKeyword = req.query.Product_Name const escapedKeyword = escapeRegExp(searchKeyword) const doc = await collection.find({ "Product_Name": new RegExp(escapedKeyword, 'i') }).toArray() console.log(doc)
原理说明
new RegExp(searchKeyword)会将用户传入的关键词转换为正则表达式,比如用户输入Test Product时,生成的正则是/Test Product/,会匹配所有Product_Name字段中包含该字符串的文档,自然能命中Test Product (22in)。- 加上
'i'标志后,搜索会忽略大小写,比如test product也能匹配到目标产品。
内容的提问来源于stack exchange,提问作者devofto
相关产品推荐
相关产品推荐

