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不同。
我错过了什么?
答案 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本身会处理它。