我尝试在Mongodb3.4中运行一些Javascript NumberDecimal测试,但是输出永远不正确,如果我使用NumberInt,那么结果是正确的。 Javascript是否取消了NumberDecimal类型?
以下是我的测试脚本:
var X=new NumberDecimal("100");
var Y=new NumberDecimal("100");
var RTNEqual=(X.valueOf()==Y.valueOf());
var RTNPlus=X+Y;
print("Equal=>" + RTNEqual + " RTNPlus=>" + RTNPlus)
Output:
Equal=>false RTNPlus=>NumberDecimal("100")NumberDecimal("100")
谢谢〜
答案 0 :(得分:3)
mongo
shell(如3.4.5所示)不支持使用NumberDecimal
值的算术。十进制类型不是JavaScript的原生类型,因此shell中的十进制值是表示存储在MongoDB中的BSON值的字符串。
根据MongoDB问题跟踪器SERVER-19676的讨论:
由于在javascript中进行非浮点数学所固有的基本问题,没有任何简单的系统可以为我们的类型提供算术支持。如果/当javascript提供运算符重载或看起来更多实时值类型的东西时,我们可能会重新审视该问题。与此同时,我们还没有计划通过方法重新实现算术。
但是,如果您通过聚合框架在服务器上进行操作,则完全支持十进制值:
var X=new NumberDecimal("100");
var Y=new NumberDecimal("100");
db.omnum.aggregate(
{ $project: {
_id: 0,
RTNEqual: { $eq: [X, Y] },
RTNPlus: { $sum: [X, Y] }
}}
)
输出:
{
"result": [
{
"RTNEqual": true,
"RTNPlus": NumberDecimal("200")
}
],
"ok": 1
}
答案 1 :(得分:0)
另一个解决方法可能是执行类似的操作
var X=new NumberDecimal("100");
var Y=new NumberDecimal("100");
var jsonY = tojson(Y)
var jsonX = tojson(X)
var RTNEqual= jsonY == jsonX;
print("Equal=>" + RTNEqual);
答案 2 :(得分:0)
感谢@Stennie。 我是这样做的:
x