2

我在 Mongo Shell 中写了以下 4 个语句

一世)NumberLong(3)

ii)NumberLong(3)+NumberLong(4)

iii)typeof NumberLong(3)

iv)typeof (NumberLong(3)+NumberLong(4))

他们相应的输出是

一世)NumberLong(3)

ii)7

iii)object

iv)number

尽管第二个结果使第四个结果很明显,但我无法了解这种行为的头部或尾部。幕后发生了什么?我尝试在 MongoDB 文档中找到基本概念,但找不到太多。请帮忙!!

4

1 回答 1

7

Number 和 NumberLong 有什么区别?

JavaScript 目前只有一个数字类型Number,表示为 IEEE 754 双精度浮点值(8 个字节)。

MongoDB 的BSON 存储表示具有比 JavaScript 更多的数字类型,包括 32 位有符号整数(4 字节)和 64 位有符号整数(8 字节)。

NumberInt()NumberLong()构造函数是shell中的数据类型mongo,允许您创建整数值而不是使用 JavaScript 的默认浮点数。这些是作为自定义原型实现的,因此typeof它们将是object(而不是numberJavaScript 原始类型的一部分)。

当您将NumberLong()NumberInt()值加在一起时,JavaScript 会将结果强制转换为本机number类型,这就是为什么您在第 2 次和第 4 次测试中的结果与第 1 次和第 3 次测试中的结果不同的原因。

为什么使用 NumberLong / NumberInt?

这些类型用于为 MongoDB 的底层 BSON 存储格式提供接口。

与 a或相比, 32 位整数 ( NumberInt) 可以用一半的字节表示。NumberNumberLong

与 a 相比, 64 位整数 ( NumberLong) 对于大整数值具有更高的精度Number。由于双精度浮点表示为指数保留了一些位Number,因此可以精确存储的最大值为 2 53而对于 a则为 2 63 -1 NumberLong

于 2013-12-19T02:40:24.963 回答