我在MongoDB文档中有一个存储任意大数字的字段。当我将其作为DBObject(MongoDB的Java驱动程序)检索时,我有时会遇到ClassCastException:
DBObject obj = collection.findOne();
long val = (Long)(o.get("numericVal"));
如果存储在numericVal
中的值是1234567890,则转换为Long成功。如果是12345,则DBObject.get()返回Double,并且转换失败。
如何在反序列化MongoDB DBObjects时确保类型安全?
答案 0 :(得分:5)
我认为你可以通过使用类型安全的getLong(String键)而不是强制转换(Long)来避免ClassCastException,并希望autoboxing做正确的事情可以让你长到很少'l'。
http://api.mongodb.org/java/2.8.0/org/bson/BasicBSONObject.html#getLong(java.lang.String)
DBObject obj = collection.findOne();
long val = o.getLong("numericVal");
我也怀疑12345成为双倍。还有其他事情发生在这里。
答案 1 :(得分:4)
一般来说,我注意到使用shell(或有时使用其他语言)将数值插入为double
例如:
db.dummycollection.update({"mykey" : 100}, { $set : { "millisecage" : 30000000 }})
插入一个double值(30000000.0) 但是
db.dummycollection.update({"mykey" : 100}, { $set : { "millisecage" : NumberLong(30000000) }})
在集合中插入正确的值
因此,如果您有任何疑问,请避免使用此类投射,或者您可以执行以下操作:
Long myValue = ((Number) obj.get("yourkey")).longValue();