MongoDB聚合查询如何检测字符串是否包含数字或特殊字符
你之前用的{ value: { $regex: "!" } }是固定匹配单个感叹号的写法,要覆盖任意特殊字符、组合条件匹配,直接调整正则规则即可,三类需求的可直接复用的写法如下:
各场景具体实现
判断字符串包含数字
用元字符\d匹配0-9的任意数字即可,不需要枚举所有数字字符。$match阶段直接用的查询写法:{ value: { $regex: "\\d" } }聚合管道内做表达式判断(比如结合
$addFields打标记、$cond做分支逻辑)时,用$regexMatch的写法:{ $regexMatch: { input: "$value", regex: /\d/ } }示例值
Luk3 Sk1w8lk3r可正常命中,纯字母、纯符号无数字的字符串不会匹配。判断字符串包含任意特殊字符
不要逐个枚举!、*、"这类特殊符号,用反向字符集做排除匹配即可,通用规则为「匹配所有非大小写英文字母、非数字、非空白字符的内容」,正则为[^a-zA-Z0-9\s],可以覆盖所有标点、特殊符号的匹配场景。$match阶段写法:{ value: { $regex: "[^a-zA-Z0-9\\s]" } }聚合表达式写法:
{ $regexMatch: { input: "$value", regex: /[^a-zA-Z0-9\s]/ } }示例值
L*ke Sk!w"lz可正常命中,如果业务规则里需要把空格也算作特殊字符,直接把正则里的\s删除即可。判断字符串同时包含数字和特殊字符
用正向零宽断言实现多条件同时匹配,不需要额外写$and拼接多个判断条件,正则为(?=.*\d)(?=.*[^a-zA-Z0-9\s]),含义是字符串中既存在至少一个数字,也存在至少一个特殊字符。$match阶段写法:{ value: { $regex: "(?=.*\\d)(?=.*[^a-zA-Z0-9\\s])" } }聚合表达式写法:
{ $regexMatch: { input: "$value", regex: /(?=.*\d)(?=.*[^a-zA-Z0-9\s])/ } }示例值
L0ke Sk!w0l'z8可正常命中,仅含数字无特殊字符、仅含特殊字符无数字的字符串都不会匹配。
注意:如果用字符串格式书写正则(而非
/规则/的正则字面量格式),反斜杠需要做二次转义,比如\d要写成\\d,否则MongoDB无法正确识别转义语义,会导致匹配逻辑失效。
内容的提问来源于stack exchange,提问作者La_haine

