Mongo Shell中NumberLong的行为

时间:2013-12-09 16:42:42

标签: mongodb mongo-shell

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

i)NumberLong(3)

ii)NumberLong(3)+NumberLong(4)

iii)typeof NumberLong(3)

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

及其相应的输出

i)NumberLong(3)

ii)7

iii)object

iv)number

虽然第二个结果使第四个结果显而易见,但我无法找到这个行为的头部或尾部。幕后发生了什么?我尝试在MongoDB文档中找到基础概念但是找不到多少。请帮助!!

1 个答案:

答案 0 :(得分:7)

Number和NumberLong之间有什么区别?

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

MongoDB的BSON storage representation包含比JavaScript更多的数字类型,包括32位有符号整数(4个字节)和64位有符号整数(8个字节)。

NumberInt()NumberLong()构造函数为data types in the mongo shell,允许您创建整数值,而不是使用JavaScript的默认浮点数。这些是作为自定义原型实现的,因此typeof这些将是object(而不是作为JavaScript基元类型的一部分的number)。

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

为什么要使用NumberLong / NumberInt?

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

NumberIntNumber相比,32位整数(NumberLong)可以用字节的一半表示。

NumberLong相比,64位整数(Number)对于大整数值具有更高的精度。由于指数的双精度浮点表示reserves some bits,可以精确存储的最大Number是2 53 而2 63 - 1表示NumberLong