MongoDB聚合中如何对name字段做字符替换后匹配查询?
可行,两种实现方式任你选
方式一:服务端先处理查询参数(最贴合你原有代码逻辑)
直接在构建查询条件前,把req.query.name做正则替换处理,再传入$match阶段,和你原来的代码衔接非常顺畅:
let query = {}; // 先对查询参数做正则替换(注意加"g"实现全局替换,否则只替换第一个匹配项) let processedName = req.query.name.replace(new RegExp("([\u0622\u0623\u0625])", "g"), "oof"); query.name = processedName; // 后续聚合阶段不变 { $match: { ...query, }, }
方式二:MongoDB聚合内处理字段(适合动态处理数据库中数据的场景)
如果你的需求是把数据库里的name字段先做替换,再和原始查询值匹配,可以用MongoDB的$regexReplace(4.4+版本支持)结合$expr在$match阶段实现:
let queryName = req.query.name; // 聚合阶段的$match写法 { $match: { $expr: { $eq: [ // 对数据库中的name字段执行正则替换 $regexReplace: { input: "$name", regex: /[\u0622\u0623\u0625]/, replacement: "oof", options: "g" }, queryName // 和原始查询值对比匹配 ] } } }
注意点
- 你原来的正则表达式
[\u0622-\u0623-\u0625]写法有问题,减号在这里会被解析为字符范围(\u0622到\u0623),如果是要匹配这三个单独的字符,应该改成[\u0622\u0623\u0625]。 - 如果需要替换空格,直接在正则里加入空格即可,比如
[\u0622\u0623\u0625\s]。
内容的提问来源于stack exchange,提问作者Chinese_hacker_lm
相关产品推荐
相关产品推荐

