MongoDB正则查询:精确匹配字符串或开头精确子串
MongoDB层级字符串正则查询解决方案
需求匹配正则(仅匹配doc1和doc2)
针对你的需求,要精确匹配Canada.Ontario或Canada.Ontario.Toronto.Downtown,同时排除其他不符合的文档,可使用以下正则表达式:
collection.find({"context": {$regex: "^Canada\\.Ontario(\\.Toronto(\\.Downtown)?)?$"}})
注意:在JavaScript环境中使用时,反斜杠需要转义为
\\.;若直接在MongoDB Shell中执行,只需写\.即可。
正则逻辑解释
^:锚定字符串开头,确保从最左侧开始匹配,避免从中间截取的无效匹配Canada\.Ontario:强制匹配前两个完整层级,直接排除像doc3这种在Canada后插入其他层级的文档(\.Toronto(\.Downtown)?)?:可选的后续层级组,?表示该组可出现0次或1次:- 组出现0次时,匹配
Canada.Ontario(对应doc2) - 组出现1次时,匹配
Canada.Ontario.Toronto.Downtown(对应doc1)
- 组出现0次时,匹配
$:锚定字符串结尾,确保没有额外的后续层级,避免匹配到更长的无效字符串
文档匹配验证
对给定集合的匹配结果:
- doc1(
Canada.Ontario.Toronto.Downtown):匹配 - doc2(
Canada.Ontario):匹配 - doc3(
Canada.EasternCanada.Ontario.Toronto.Downtown):不匹配(Canada后不是.Ontario) - doc4(
England.London):不匹配(开头不是Canada) - doc5(
France.SouthFrance.Nice):不匹配 - doc6(空字符串):不匹配
通用场景扩展(匹配目标字符串的所有前缀层级)
如果需要匹配目标字符串Canada.Ontario.Toronto.Downtown的所有前缀层级(包括Canada、Canada.Ontario、Canada.Ontario.Toronto、Canada.Ontario.Toronto.Downtown),可使用以下正则:
collection.find({"context": {$regex: "^Canada(\\.Ontario(\\.Toronto(\\.Downtown)?)?)?$"}})
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

