2

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

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

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

好吧,我们收到了与我们请求的 ID 不同的文档 ID 的响应。

我错过了什么?

4

2 回答 2

2

Javascript 无法处理这么大的数字 -它只能处理高达 2^53 的整数

您可以通过将887190505588098573其放入 JS 控制台来查看这一点,然后您会收到887190505588098600回复。

非 JS 客户处理这个就好了。例如,红宝石:

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"}
于 2014-06-13T01:38:24.987 回答
0

MongoDB 中有一种NumberLong类型确实符合 64 位整数(BSON 类型18)

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

所以匹配上$type

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

里程可能会因您可以在哪里使用它而有所不同,因为浏览器客户端可能会获得它的扩展 JSON 形式,但是在没有类似地包装在一个类中来处理它的情况下,如何使用它是有限制的。

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

于 2014-06-13T01:59:46.553 回答