Mongodb使用BSON格式将数据存储在磁盘上。BSON定义了不同的数据类型,包括用于存储大整数的带符号int64。
让我们尝试使用大ID(887190505588098573(保存文档,该ID符合带符号的int64范围(其绝对值小于2^63(
> db.query.insert({_id: 887190505588098573, 'q': 'zzz'})
> db.query.find({_id: 887190505588098573})
{ "_id" : 887190505588098600, "q" : "zzz" }
嗯,我们得到的回复是文件ID与我们要求的ID不同。
我错过了什么?
Javascript不能处理这么大的数字,它只能处理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"}
MongoDB中有一个NumberLong
类型符合64位整数(BSON类型18(
db.collection.insert({ "_id": new NumberLong(887190505588098573) })
因此匹配$type
db.collection.find({ "_id": { "$type": 18 } })
不过,里程可能会因您可以在哪里使用而有所不同,因为浏览器客户端可能会获得这种扩展的JSON形式,但在不类似地封装在类中处理它的情况下,如何使用它是有限制的。
使用大多数其他语言应该很好,因为驱动程序将转换为本机类型。因此,这实际上取决于语言实现的实用性。但是MongoDB本身会处理它。