MongoDB 罗盘:无法过滤特定 ID

MongoDB Compass : can't filter a specific ID

我有一个 MongoDB Collection 这样的构建 :

当我尝试按 ID 过滤时,我得到了不一致的结果。例如,当我尝试获取第一个条目时,通过输入过滤器查询:

{_id:209383449381830657}

我没有找到结果。

但是如果我输入第三个例子,它会正常工作。

{_id:191312485326913536}

我搜索了它是否是由于 int 太大但不是,所有 _id 值都是 Int64 并且它是生成所有条目的相同代码。

我真的不知道为什么会得到这个结果,也不知道我为什么要在这里问。

编辑:

这取决于您拥有的 MongoDB 指南针的版本(我假设它是 +- 最新的)

据我所知,您在 _id 字段中使用了 NumberLong。

您可以使用 NumberLong("...") 来处理 MongoDB 中的此类字段。

所以,最好尝试这样搜索

{_id: NumberLong("209383449381830657")}

无法确定 MongoDB Compass 如何处理您要传递给这里的号码。 因为它应该自动将值转换为 int32 或 int64,但这可能有点棘手。所以,还是自己定义好,避免出现意想不到的结果。

前段时间我读了一篇文章,它试图转换为 int32,但如果它超过了 int32 可能处理的 -> 那么它使用这个函数 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger 并尝试将其转换为 int64。我的推测是这里存在问题,但不能确定。

MongoDB Compass 使用 mongo 的 node.js 驱动程序。

209383449381830657 和 191312485326913536 都超过 javascript 最大安全整数 (2^53-1)。

Javascript 不会以一致的方式处理大于该值的数字。

请注意,在您的文档中,这些数字被报告为 $numberLong,表明它们没有使用 javascript 的默认浮点数字表示法。

要一致查询这些数字,查询时使用NumberLong构造函数,如

{_id:NumberLong("209383449381830657")}

在我的例子中,_id 包含十六进制数字。 过滤器 {_id: ObjectId("62470af3036b9f058552032e")} 有效