我在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存储格式的接口。
与NumberInt
或Number
相比,32位整数(NumberLong
)可以用一半字节表示。
与NumberLong
相比,64位整数(Number
)对于大整数值的精度更高。由于指数的双精度浮点表示reserves some bits,因此可以精确存储的最大值Number
是253,而aNumberLong
是263-1。