如何在JavaScript Mongodb中新建一个NumberDecimal()?

时间:2017-06-15 10:47:31

标签: javascript mongodb

我尝试在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")

谢谢〜

3 个答案:

答案 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