MongoDB正则匹配带括号的大小写不敏感全字符串问题问询
解决MongoDB正则全匹配含括号且忽略大小写的问题
你的问题核心在于正则中的特殊字符未转义,以及全匹配的正则写法不准确,我来一步步帮你修正:
问题分析
- 括号是正则元字符:你目标字符串里的
(150 g Each)中的(和)在正则表达式里是用来定义分组的特殊字符,不转义的话MongoDB会把它们当作正则语法,而不是字面的括号,导致匹配失败。 - 全匹配的写法错误:你用了
.*前后包裹,这会匹配包含目标字符串的任意内容,而不是完全等于目标字符串(仅大小写差异)。如果要全匹配,应该用^(字符串开头)和$(字符串结尾)来限定范围。
正确的查询方案
方案1:精确全匹配(忽略大小写)
这个方案会匹配name.en字段完全等于目标字符串(不管大小写)的记录,同时正确处理括号:
db.shop_items.findOne({ 'name.en': { $regex: '^Monginis Chocolate Muffins 6 N \\(150 g Each\\)$', $options: 'i' } })
^和$确保整个字符串从开头到结尾完全匹配,不会匹配类似"Extra Monginis Chocolate Muffins 6 N (150 g Each)"这种包含目标字符串的更长内容。\\(和\\)是对括号的转义(MongoDB的字符串里需要双反斜杠来表示正则里的单个反斜杠)。i选项开启忽略大小写模式,处理大小写差异的情况。
方案2:正则字面量写法(更简洁)
你也可以直接用正则字面量,这样只需要单反斜杠转义括号:
db.shop_items.findOne({ 'name.en': /^Monginis Chocolate Muffins 6 N \(150 g Each\)$/i })
如果你需要的是“包含匹配”(而非全匹配)
如果你的需求其实是匹配包含目标字符串(不管大小写和前后内容)的记录,只需要修正括号的转义即可:
db.shop_items.findOne({ 'name.en': { $regex: '.*Monginis Chocolate Muffins 6 N \\(150 g Each\\).*', $options: 'i' } })
内容的提问来源于stack exchange,提问作者Ajay Malik
相关产品推荐
相关产品推荐

