Node.js中的MongoDBtypes

是否有一个node.js模块允许我的应用程序具有与MongoDB相同的types:

http://docs.mongodb.org/manual/reference/bson-types/

例如,在我的node.js应用程序中,我希望它对Integertypes有完整的理解,但是node.js不能识别任何东西,除了我自己理解的开箱即用的数字。

node.js不能识别任何东西,但是对于我的理解来说,开箱即可。

那么,这是JavaScript的devise决定。 JavaScript只有一个Numbertypes,即如果实现遵循标准的build议,则表示为IEEE-754双精度浮点数 。 这隐藏了很多复杂的shortlongfloatdouble和所有其他大多数其他语言中常见的数字types。 这也是一个很好的折中,因为它们的整数精度可达2 ^ 53 – 1,所以你很less需要在这个范围以外的东西,大部分时间,如果你这样做,通常long不会削减它…

另一方面,MongoDB是用C ++编写的,因此更接近数据如何实际存储在内存中的细节。 缩小这个差距并不是微不足道的。

是否有一个node.js模块允许我的应用程序具有与MongoDB相同的types?

在某种程度上,你正在与底层的编程语言作斗争。 如果存在这样一个模块,它也将不得不以一种完全不同的方式执行很多操作 ,例如长时间添加(结果> 2 ^ 53-1)。 例如,它可以通过将数字转换为string并手动添加单个数字来完成,这将会非常慢。

类似这样的事情发生在mongo shell中,例如对于非常长的整数,它使用像NumberLong("1223")这样的语法。 但是它并没有重新实现这个操作 ,而是回到了常规的V8 JavaScript。 certificate:

 > var foo = NumberLong("36028797018963968") // 2^55 > var foo2 = foo + NumberLong("1") > foo2 36028797018963970 // should be 36028797018963969 

或者,这样的模块可以是使用诸如C ++之类的本地编程语言的现有实现的本地模块 。 有一个名为“边缘”的节点模块,显然是为C#做的 。 然而,这种复杂性相当复杂,因为跨越语言边界需要编组 ,这样既昂贵又棘手。

换句话说:获得一组真正不同的types需要另一种编程语言。 使你的代码粗略地坚持你的模式是可能的,例如通过mongoose或通过编码规范,但它不会使JS强types。