You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mongosh中NumberDecimal相加为何是字符串拼接?如何实现数值加法?

NumberDecimal加法被当作字符串拼接的原因及正确实现方式

为什么+会被当作字符串拼接

在mongosh环境中,JavaScript的+运算符兼具数值加法与字符串拼接两种功能。对于MongoDB的NumberDecimal(以及NumberLong)这类自定义BSON类型对象,执行+运算时,JavaScript会优先将对象转换为原始值,而这类对象的默认转换逻辑是调用toString()方法返回字符串形式,因此两个NumberDecimal实例相加就变成了字符串拼接,得到'12'。

而-、*、/这类运算符仅触发数值转换,会调用对象的valueOf()方法获取数值,所以能正常执行算术运算。

至于NumberInt没有这个问题,是因为它本质是JavaScript原生Number类型的包装,转换时直接返回数值,+运算会按数值加法处理。

正确实现NumberDecimal加法的方法

有几种可行的实现方式:

1. 使用MongoDB聚合运算符$add

这是最贴合MongoDB数据类型的处理方式,通过聚合操作执行数值加法:

db.aggregate([
  { $project: { result: { $add: [NumberDecimal('1'), NumberDecimal('2')] } } }
])
// 返回结果:{ "_id" : null, "result" : NumberDecimal("3") }

2. 手动调用valueOf()转换为数值后相加

直接获取NumberDecimal的原生数值再执行加法:

NumberDecimal('1').valueOf() + NumberDecimal('2').valueOf()
// 输出:3

3. 用一元+运算符强制转换为数值

利用一元+触发数值转换,再执行加法操作:

+NumberDecimal('1') + +NumberDecimal('2')
// 输出:3

内容的提问来源于stack exchange,提问作者Marv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:15