【问题标题】:MongoDB Compass : can't filter a specific IDMongoDB Compass:无法过滤特定 ID
【发布时间】:2021-08-07 20:23:48
【问题描述】:

我有一个这样的 MongoDB 集合构建:

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

{_id:209383449381830657}

我没有找到任何结果。

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

{_id:191312485326913536}

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

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

编辑:

  • 所有条目都具有相同的类型。
  • 查询中未设置限制。
  • 如果我输入{_id:{"$gte":209383449381830657}},它会找到条目,但如果我输入{_id:{"$eq":209383449381830657}},则不会

【问题讨论】:

    标签: mongodb mongodb-query mongodb-compass


    【解决方案1】:

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

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

    Javascript 无法以一致的方式处理大于该数字的数字。

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

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

    {_id:NumberLong("209383449381830657")}
    

    【讨论】:

    • 非常感谢。
    【解决方案2】:

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

    如我所见,您正在为 _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。我的猜测是问题存在于此,但不能肯定地说。

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多