Mongodb找不到具有太长_id的对象

时间:2016-07-19 11:41:09

标签: mongodb mongodb-query mongo-shell

我有点奇怪的情况。

我将对象保留在集合“refs”中明确设置_id。 所以我的对象有很大的id。

db.refs.find().sort({_id: -1});
// {_id: 9200000000165761625}
// ...

但是当我尝试在mongo shell中找到具有最大id的对象时,它什么都不返回:

db.refs.find({_id: 9200000000165761625}); // nothing

但是!

db.refs.find({_id: 9200000000165761625}).count(); // return 1

这怎么可能发生?

2 个答案:

答案 0 :(得分:0)

我无法重现你的问题。我能够成功查询您指定的_id值。 enter image description here

确保在查询时传递正确的集合名称

答案 1 :(得分:0)

JavaScript目前只有一个数字类型Number,它将所有值表示为64位浮点值。 JavaScript本机Number类型中的最大安全整数表示为2 53 -1或9007199254740991(由常量Number.MAX_SAFE_INTEGER返回)。

超出安全范围的任何整数值都无法清楚地表示,因此两个或多个数学值将映射到相同的JavaScript编号。

您可以在mongo shell中看到此效果,其值与您提供的_id相邻(大于安全整数):

> 9200000000165761624
9200000000165762000

> 9200000000165761625
9200000000165762000

> 9200000000165761626
9200000000165762000

但是,这些驱动程序/客户端限制与MongoDB BSON format中用于文档的基础数据类型不同。 BSON有一个64位整数类型,表示整个值范围:对于64位整数,最多2 63 -1。

您的示例_id在64位整数范围内,因此您应该能够使用支持64位整数的驱动程序插入或更新它,但无法安全地查询或操作多个mongo shell或其他JavaScript环境中的值。为避免意外结果,您可能希望为这些长_id值使用不同的数据类型。