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

例如,我有一个在Node.js中定义的variables

var foo = 15 

我知道JavaScript把这个值作为一个浮点数,我不能指定types。 我正在使用mongodb模块将此值保存到文档中:

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

有可能这样做?

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

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

从另一个angular度来看, 在JavaScript中所有数值都是数字和数字是IEEE 754双精度64位浮点数 。 由于这个事实, JavaScript本身并没有区分整数types和浮点types

为了进一步理解MongoDB本身如何处理数字types,你可以使用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. 

正如你所看到的,无论人们期望看到什么数字types,所有东西都存储为双精度浮点值。

另见这个讨论 。

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