MongoDB使用$toInt转整数报错Failed to parse number '3134-13'如何解决
问题原因及解决方案
1. 正则匹配规则写法错误
你当前的过滤规则{'$regex': "/-/"}存在语法问题:MongoDB的$regex运算符不需要用斜杠包裹表达式,加斜杠后会被识别为要匹配/-/三个字符的内容,无法筛选掉仅包含单个横杠的记录,这是你过滤失效的核心原因。
修正后的匹配规则如下:
match1={ "$match":{"end": { '$not': { '$regex': '-' } } } } match2={ "$match":{"start":{ '$not': { '$regex': '-' } } } }
更稳妥的写法是直接匹配全数字的合法整数字符串,避免空格、字母等其他非数字内容触发转换错误:
match1={ "$match":{"end": { '$regex': '^\\d+$' } } } match2={ "$match":{"start":{ '$regex': '^\\d+$' } } }
2. 使用更安全的$convert运算符避免报错
就算过滤逻辑完全正常,也可能遇到空值、非字符串类型的异常场景,推荐使用$convert替代$toInt,自定义转换失败和空值的默认返回值,从根源避免转换报错:
addFields1 = { '$addFields': { 'convertedend': { '$convert': { 'input': "$end", 'to': "int", 'onError': None, # 可自定义转换失败时的返回值,比如0 'onNull': None # 可自定义字段为空时的返回值 } }, 'convertedstart': { '$convert': { 'input': "$start", 'to': "int", 'onError': None, 'onNull': None } } } }
如果不需要转换失败的记录,可以在$addFields之后新增匹配阶段,过滤掉convertedend或convertedstart为None的记录即可。
额外注意项
你当前的$group阶段存在笔误,convertedstart赋值的是$convertedend,建议修正为对应字段:
group={ "$group":{'_id': '$_id', 'convertedend':'$convertedend','convertedstart':'$convertedstart'} }
内容的提问来源于stack exchange,提问作者Mon
相关产品推荐
相关产品推荐

