MongoDB和Node.js:将int32保存为double

时间:2014-12-11 13:49:00

标签: javascript node.js mongodb

我在Node.js中定义了一个变量,例如

var foo = 15

我知道JavaScript会将此值视为浮点数,但我无法指定类型。 我正在使用mongodb模块将此值保存到文档中:

当我使用insert方法保存值并将值传递给方法时,我在db文档中观察到类型为int32,但我需要mongodb将值保存为double(15.0000)。

可以这样做吗?

2 个答案:

答案 0 :(得分:0)

MongoDB可能只将数值存储为双精度数。

MongoDB使用BSON,它是类似JSON的文档的二进制编码序列化,而这些文档又是JavaScript对象文字的子集。 BSON确实定义了" double"以及" int32"和" int64"类型;但是,目前还不清楚MongoDB驱动程序是否可以直接使用这些整数类型,或者它们是否是抽象类型。

以另一种方式看待它;在JavaScript中,所有数值均为Numbers,数字为IEEE 754 double precision 64-bit floating point numbers。由于这个事实, JavaScript本身不区分整数和浮点类型

要进一步了解MongoDB本身如何处理数字类型,您可以使用mongo shell:

$ mongo foo
> db.foo.insert({looksLike:'int',   value:15})
> db.foo.insert({looksLike:'float', value:15.0})
> db.foo.insert({looksLike:'int64', value:Math.pow(2, 60)})
> db.foo.find({value:{ $type: 1 }}, {_id:0}) // Type 1 is "double".
{ "looksLike" : "int", "value" : 15 }
{ "looksLike" : "float", "value" : 15 }
{ "looksLike" : "int64", "value" : 1152921504606847000 } // Note inexact value.

如您所见,无论人们可能期望看到什么数字类型,所有内容都存储为双精度浮点值。

另见this discussion

最终,如果必须使用MongoDB,并且某些数据库客户端必须处理具有特定数字类型的数值(例如int32,int64),那么客户端本身必须执行类型转换,因为MongoDB不会为您执行此操作。

答案 1 :(得分:0)

是的,您可以将其另存为两倍。但是,如@maerics所示,类型转换必须由您在Nodejs方面完成。 MongoDB不会为您这样做。

为您提供解决方案:

var Double = require("mongodb").Double;
var foo = Double(15)

现在您可以在集合中插入foo,您将看到它在其中为double。