MongoDB和大型数字文档ID

时间:2014-06-13 01:30:44

标签: mongodb signed bson int64

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

让我们尝试使用大ID(887190505588098573)保存符合有符号int64范围的文档(其绝对值小于2 ^ 63)

> db.query.insert({_id: 887190505588098573, 'q': 'zzz'})
> db.query.find({_id: 887190505588098573})
{ "_id" : 887190505588098600, "q" : "zzz" }

好吧,我们收到的回复文件ID与我们要求的ID不同。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

Javascript无法处理大数字it only handles integers up to 2^53

你可以通过将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"}

答案 1 :(得分:0)

MongoDB中的NumberLong类型符合64位整数(BSON type 18)

db.collection.insert({ "_id": new NumberLong(887190505588098573) })

以便匹配$type

db.collection.find({ "_id": { "$type": 18 } })

里程可能因你可以使用它的位置而有所不同,因为浏览器客户端可能会获得扩展的JSON形式,但是如果没有类似的包装来处理它,它的使用方式也有限制。

使用大多数其他语言应该没问题,因为驱动程序将转换为本机类型。因此,实际上这取决于您的语言实现。但是MongoDB本身会处理它。