JAVA java.lang.Long类型操作MongoDB NumberLong类型的数据不显示

你在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类型。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值