MongoDB正则查询如何实现不区分大小写匹配
实现MongoDB多字段忽略大小写搜索的方案
你不需要手动对字段做转小写操作,有两种成熟实现方式,优先选择第一种:
方案1:给正则匹配加大小写不敏感修饰符(推荐)
MongoDB原生正则支持i修饰符直接实现忽略大小写匹配,不需要额外做字段大小写转换,写法最简单,且可以直接命中字段上的普通索引,查询性能最优。
修改后的查询代码如下:
// 假设你的搜索关键词是变量keyword,建议提前做特殊字符转义避免正则注入 filter := bson.M{ "$or": bson.A{ bson.M{"title": bson.M{"$regex": keyword, "$options": "i"}}, bson.M{"author": bson.M{"$regex": keyword, "$options": "i"}}, bson.M{"content": bson.M{"$regex": keyword, "$options": "i"}}, }, } // 直接执行find查询即可 cur, err := p.postProposalCollection.Find(ctx, filter)
说明:
$options: "i"会让正则匹配自动忽略字段值和搜索词的大小写差异,完全覆盖你要的「转小写后匹配」的效果。
方案2:强制转字段为小写后做匹配(仅适合特殊定制场景)
如果你有特殊逻辑必须先把字段值统一转为小写再匹配,可以使用$expr聚合表达式配合$toLower字符串操作符实现,注意这种写法默认无法命中普通单字段索引,大数据量下性能较差。
示例代码如下:
import "strings" // 提前把搜索关键词转为全小写 lowerKeyword := strings.ToLower(keyword) filter := bson.M{ "$expr": bson.M{ "$or": bson.A{ // 用$regexMatch做正则匹配,input传入转小写后的字段值 bson.M{"$regexMatch": bson.M{"input": bson.M{"$toLower": "$title"}, "regex": lowerKeyword}}, bson.M{"$regexMatch": bson.M{"input": bson.M{"$toLower": "$author"}, "regex": lowerKeyword}}, bson.M{"$regexMatch": bson.M{"input": bson.M{"$toLower": "$content"}, "regex": lowerKeyword}}, }, }, } cur, err := p.postProposalCollection.Find(ctx, filter)
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

