你在Java中使用 Long 类型查询MongoDB中存储为 NumberLong 的数据时遇到问题,这通常是由于数据类型不匹配大整数精度丢失导致的。为了帮助你清晰地理解和解决这个问题,我梳理了可能的原因和解决方案:

问题原因说明解决方案
🔍 数据类型不匹配MongoDB的NumberLong是特定类型,Java Long可能被识别为其他类型。使用org.bson.types.Long构建查询对象。
🔍 大整数精度丢失大整数(如超过2^53-1)在MongoDB的JavaScript引擎中可能丢失精度。确保查询时NumberLong的参数是字符串形式。
🔍 Java驱动处理差异从MongoDB取回的NumberLong类型数据,Java驱动可能返回IntegerLong使用Number类过渡:((Number) doc.get("field")).longValue()

🛠️ 推荐解决方案

请尝试按照以下步骤修改你的Java代码:

  1. 修正查询代码
    在构建查询条件时,确保为字段值使用 org.bson.types.Long 类型来对应MongoDB的NumberLong,并且使用字符串参数确保精度。

    java

    import org.bson.types.Long;
    // ... 其他导入
    // 构建查询条件,使用org.bson.types.Long,并用字符串初始化
    BasicDBObject query = new BasicDBObject("yourFieldName", new Long("1985581077896405030"));
    // 然后执行查询...
  2. 处理查询结果(如果需要)
    从MongoDB取回数据时,如果字段类型不确定,一个比较稳妥的方法是先将其视为Object,然后通过Number类过渡:

    java

    // 假设document是你的查询结果文档
    Object fieldValue = document.get("yourFieldName");
    Long yourFieldValue = ((Number) fieldValue).longValue();

    或者,如果确认是数字类型,也可以根据实际类型转换:

    java

    if (fieldValue instanceof Integer) {
        yourFieldValue = ((Integer) fieldValue).longValue();
    } else if (fieldValue instanceof Long) {
        yourFieldValue = (Long) fieldValue;
    } else if (fieldValue instanceof org.bson.types.Long) {
        yourFieldValue = ((org.bson.types.Long) fieldValue).getValue();
    }

🔍 其他排查建议

如果上述方法仍未解决问题,建议进行以下排查:

  • 检查MongoDB中的实际存储:在MongoDB shell中,直接使用 db.yourCollection.find({"yourFieldName": NumberLong("1985581077896405030")}) 进行查询,这有助于确认数据是否存在以及查询语句本身是否正确。

  • 核对Java驱动版本:较旧版本的MongoDB Java驱动可能对NumberLong的支持不完善,尝试更新到与你的MongoDB服务器兼容的最新稳定版本

💎 总结

总的来说,Java Long类型查询不到MongoDB NumberLong数据,主要排查数据类型匹配大整数精度以及Java驱动处理方式请务必确保在操作大整数时使用字符串形式传入NumberLong,并在Java代码中对应使用org.bson.types.Long类型。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐