Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB和大型数字文档ID_Mongodb_Signed_Bson_Int64 - Fatal编程技术网

MongoDB和大型数字文档ID

MongoDB和大型数字文档ID,mongodb,signed,bson,int64,Mongodb,Signed,Bson,Int64,Mongodb使用BSON格式在磁盘上存储数据。BSON定义了不同的数据类型,包括用于存储大整数的带符号int64 让我们尝试使用大ID(887190505588098573)保存文档,该ID适合签名int64范围(其绝对值小于2^63) >db.query.insert({u id:88719050558898573,'q':'zzz'}) >find({u id:8871905055888098573}) {“_id”:887190505588098600,“q”:“zzz”} 嗯,我们得

Mongodb使用BSON格式在磁盘上存储数据。BSON定义了不同的数据类型,包括用于存储大整数的带符号int64

让我们尝试使用大ID(887190505588098573)保存文档,该ID适合签名int64范围(其绝对值小于2^63)

>db.query.insert({u id:88719050558898573,'q':'zzz'})
>find({u id:8871905055888098573})
{“_id”:887190505588098600,“q”:“zzz”}
嗯,我们得到了与我们请求的ID不同的文档ID的响应


我遗漏了什么?

Javascript无法处理这么大的数字-

您可以通过将
887190505588098573
放入JS控制台看到这一点,您将收到
887190505588098600
返回

非JS客户端可以很好地处理这个问题。例如,Ruby:

jruby-1.7.12 :013 > c["test"]["query"].insert({_id: 887190505588098574, q: 'zzz'})
 => 887190505588098574
jruby-1.7.12 :016 > c["test"]["query"].find({_id: 887190505588098574}).next()
 => {"_id"=>887190505588098574, "q"=>"zzz"}

MongoDB中存在符合64位整数(18)的
NumberLong
类型

db.collection.insert({u id:newnumberlong(887190505588098573)})
所以这和

db.collection.find({“\u id”:{“$type”:18})
不过,在何处可以使用它,里程数可能会有所不同,因为浏览器客户端可能会获得这种扩展JSON形式,但在如何使用它方面存在限制,而无需在类中进行类似的包装来处理它


使用大多数其他语言应该可以,因为驱动程序将强制转换为本机类型。因此,它的实用性实际上取决于您的语言实现。但是MongoDB自己会处理的。

谢谢!好消息!我刚刚遇到了一些通过python在mongodb中存储大整数的问题,然后我发现了我在问题中描述的问题。现在我有足够的信息来解决这个问题。