我在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文档中找到底层概念,但找不到太多。请帮忙!!

最佳答案

数字和数字长有什么区别?
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(而number是javascript原语类型的一部分)。
当您将NumberLong()NumberInt()值加在一起时,javascript将结果强制为nativenumber类型,这就是为什么第2次和第4次测试的结果与第1次和第3次测试的结果不同。
为什么使用数字长/数字打印?
这些类型用于提供MongoDB底层BSON存储格式的接口。
NumberIntNumber相比,32位整数(NumberLong)可以用一半字节表示。
NumberLong相比,64位整数(Number)对于大整数值的精度更高。由于指数的双精度浮点表示reserves some bits,因此可以精确存储的最大值Number是253,而aNumberLong是263-1。

09-25 18:45