MongoDB 罗盘:无法过滤特定 ID
MongoDB Compass : can't filter a specific ID
我有一个 MongoDB Collection 这样的构建 :
当我尝试按 ID 过滤时,我得到了不一致的结果。例如,当我尝试获取第一个条目时,通过输入过滤器查询:
{_id:209383449381830657}
我没有找到结果。
但是如果我输入第三个例子,它会正常工作。
{_id:191312485326913536}
我搜索了它是否是由于 int 太大但不是,所有 _id
值都是 Int64
并且它是生成所有条目的相同代码。
我真的不知道为什么会得到这个结果,也不知道我为什么要在这里问。
编辑:
- 所有条目的类型相同。
- 查询中没有设置限制。
- 如果我输入
{_id:{"$gte":209383449381830657}}
它会找到该条目,但如果我输入 {_id:{"$eq":209383449381830657}}
则不会
这取决于您拥有的 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")} 有效
我有一个 MongoDB Collection 这样的构建 :
当我尝试按 ID 过滤时,我得到了不一致的结果。例如,当我尝试获取第一个条目时,通过输入过滤器查询:
{_id:209383449381830657}
我没有找到结果。
但是如果我输入第三个例子,它会正常工作。
{_id:191312485326913536}
我搜索了它是否是由于 int 太大但不是,所有 _id
值都是 Int64
并且它是生成所有条目的相同代码。
我真的不知道为什么会得到这个结果,也不知道我为什么要在这里问。
编辑:
- 所有条目的类型相同。
- 查询中没有设置限制。
- 如果我输入
{_id:{"$gte":209383449381830657}}
它会找到该条目,但如果我输入{_id:{"$eq":209383449381830657}}
则不会
这取决于您拥有的 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")} 有效