如何查找数组字段中包含单短横线(-)错误值的数据库文档
错误文档精准查询方案
问题规则说明
指定employerId对应的数据集内,occupationalCategory数组字段的元素存在格式错误:职业编码与名称之间的分隔符被写为两边带空格的单个短横线(-),不符合规范要求的两边带空格的双短横线(--)。
注意:职业编码本身自带的短横线(如编码
15-1132.00中夹在数字间的-)属于合法内容,查询时需排除这类场景的干扰,避免误匹配。
- 错误数据样例
"occupationalCategory" : [ "15-1132.00 - Software Developers, Applications" ]
- 正确数据样例
"occupationalCategory" : [ "15-1132.00 -- Software Developers, Applications" ]
查询实现(MongoDB)
标准版本(支持正则零宽断言,MongoDB 4.0及以上)
直接通过正则精准匹配错误分隔符,不会误判合法短横线和正确格式的双短横线:
db.你的实际集合名.find({ // 替换为实际要查询的employerId值 employerId: "指定的employerId值", occupationalCategory: { $elemMatch: { // 正则逻辑:匹配前后带空格、且自身前后都没有额外短横线的单个短横线 $regex: /(?<!-)\s-\s(?!-)/ } } })
正则逻辑拆解:
(?<!-):负向反向断言,确保匹配到的短横线前面没有其他短横线,排除双短横线的第一个横杠\s-\s:匹配前后带空白字符的短横线,过滤掉编码内部夹在数字间、无空格的合法短横线(?!-):负向正向断言,确保匹配到的短横线后面没有其他短横线,排除双短横线的第二个横杠
低版本兼容写法(MongoDB 4.0以下)
低版本不支持零宽断言语法时,可以通过“匹配含单短横线分隔符、排除含双短横线分隔符”的逻辑实现同等精度查询:
db.你的实际集合名.find({ employerId: "指定的employerId值", occupationalCategory: { $elemMatch: { $regex: /\s-\s/, $not: /\s--\s/ } } })
内容的提问来源于stack exchange,提问作者Chowdary
相关产品推荐
相关产品推荐

