MongoDB和大数字文档ID



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本身会处理它。

最新更新