你在Java中使用 Long 类型查询MongoDB中存储为 NumberLong 的数据时遇到问题,这通常是由于数据类型不匹配或大整数精度丢失导致的。为了帮助你清晰地理解和解决这个问题,我梳理了可能的原因和解决方案:
| 问题原因 | 说明 | 解决方案 |
|---|---|---|
| 🔍 数据类型不匹配 | MongoDB的NumberLong是特定类型,Java Long可能被识别为其他类型。 | 使用org.bson.types.Long构建查询对象。 |
| 🔍 大整数精度丢失 | 大整数(如超过2^53-1)在MongoDB的JavaScript引擎中可能丢失精度。 | 确保查询时NumberLong的参数是字符串形式。 |
| 🔍 Java驱动处理差异 | 从MongoDB取回的NumberLong类型数据,Java驱动可能返回Integer或Long。 | 使用Number类过渡:((Number) doc.get("field")).longValue()。 |
🛠️ 推荐解决方案
请尝试按照以下步骤修改你的Java代码:
-
修正查询代码:
在构建查询条件时,确保为字段值使用org.bson.types.Long类型来对应MongoDB的NumberLong,并且使用字符串参数确保精度。java
import org.bson.types.Long; // ... 其他导入 // 构建查询条件,使用org.bson.types.Long,并用字符串初始化 BasicDBObject query = new BasicDBObject("yourFieldName", new Long("1985581077896405030")); // 然后执行查询... -
处理查询结果(如果需要):
从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类型。
516

被折叠的 条评论
为什么被折叠?



