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

MongoDB and Node.js: saving int32 as double

本文关键字:int32 保存 double Node js MongoDB      更新时间:2023-09-26

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

var foo = 15

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

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

可以这样做吗?

是的,您可以将其另存为双精度。但正如@maerics所示,类型转换必须由您在 Nodejs 端完成。MongoDB不会为你做这件事。

对于您的解决方案:

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

现在你可以在一个集合中插入foo,你会看到,它是双精度的。

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

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

换个角度看;在JavaScript中,所有的数值都是数字,数字是IEEE 754双精度64位浮点数。 由于这个事实,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.

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

另请参阅此讨论。

最终,如果您必须使用MongoDB,

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