【问题标题】:Mongodb can't find object with too long _idMongodb找不到_id太长的对象
【发布时间】:2016-07-19 11:41:09
【问题描述】:

我的情况有点奇怪。

我将对象保存在集合“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

怎么会这样?

【问题讨论】:

  • db.refs.count({_id: 9200000000165761625}) 怎么样
  • 我在尝试使用 twitter ID 作为我的 _id 时遇到了同样的问题。将 python 加载器代码更改为使用 str(tweet.id)。

标签: mongodb mongodb-query mongo-shell


【解决方案1】:

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

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

【讨论】:

  • 仅供参考,问题在您的屏幕截图中仍然很明显:超过 JavaScript 的最大安全整数的值无法在 mongo shell 中安全地表示。您插入的 _id 与您正在搜索的值(数学上)不匹配,但两者最终都具有与 JavaScript 编号相同的表示。
【解决方案2】:

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

任何超出安全范围的整数值都无法明确表示,因此两个或多个数学值将映射到同一个 JavaScript 数字。

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

> 9200000000165761624
9200000000165762000

> 9200000000165761625
9200000000165762000

> 9200000000165761626
9200000000165762000

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 2013-05-30
    • 2014-02-11
    • 2022-01-17
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多