我有点奇怪的情况。
我将对象保留在集合“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
这怎么可能发生?
答案 0 :(得分:0)
答案 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
值使用不同的数据类型。