MongoDB 3.4.14中String转Double的替代方案求助
替代$convert实现字符串转Double(MongoDB 3.4.14以下版本)
因为$convert和$toDouble都是MongoDB 3.4.14及以上版本才支持的运算符,针对低版本可以用以下两种替代方案:
方案1:利用算术运算隐式转换
MongoDB在执行算术运算时会自动尝试将字符串转换为数字类型,最简单的方式是给目标字符串加0或者乘1:
... { $addFields: { uslDouble: { $add: ["$currentDimension.usl", 0] } } }, ...
或者用$multiply:
... { $addFields: { uslDouble: { $multiply: ["$currentDimension.usl", 1] } } }, ...
注意:如果目标字符串不是合法的数字格式(比如包含字母、特殊符号),转换后会返回null,无法直接返回自定义错误信息。
方案2:结合条件判断模拟错误处理
如果需要像原代码那样在转换失败时返回自定义提示,可以用$cond配合$regexMatch先判断字符串是否符合数字格式,再执行转换或返回错误信息:
... { $addFields: { uslDouble: { $cond: { if: { $regexMatch: { input: "$currentDimension.usl", // 正则匹配整数、小数,如需支持科学计数法可调整为 /^-?\d+(\.\d+)?([eE][+-]?\d+)?$/ regex: /^-?\d+(\.\d+)?$/ } }, then: { $add: ["$currentDimension.usl", 0] }, else: "Impossible to convert str to double" } } } }, ...
说明:$regexMatch是MongoDB 3.0+支持的运算符,覆盖大部分低于3.4.14的版本;如果你的版本更低(比如2.x),可以替换为$regex结合$eq的写法:
if: { $eq: [{ $regex: "$currentDimension.usl", /^-?\d+(\.\d+)?$/ }, true] }
内容的提问来源于stack exchange,提问作者jdc
相关产品推荐
相关产品推荐

