我在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文档中找到基础概念但是找不到多少。请帮助!!
答案 0 :(得分:7)
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次测试不同的原因
这些类型用于为MongoDB的底层BSON存储格式提供接口。
与NumberInt
或Number
相比,32位整数(NumberLong
)可以用字节的一半表示。
与NumberLong
相比,64位整数(Number
)对于大整数值具有更高的精度。由于指数的双精度浮点表示reserves some bits,可以精确存储的最大Number
是2 53 而2 63 - 1表示NumberLong
。