MongoDB / Java:在DBObjects中键入安全性

时间:2012-09-06 17:32:18

标签: java mongodb types deserialization

我在MongoDB文档中有一个存储任意大数字的字段。当我将其作为DBObject(MongoDB的Java驱动程序)检索时,我有时会遇到ClassCastException:

DBObject obj = collection.findOne();
long val = (Long)(o.get("numericVal"));

如果存储在numericVal中的值是1234567890,则转换为Long成功。如果是12345,则DBObject.get()返回Double,并且转换失败。

如何在反序列化MongoDB DBObjects时确保类型安全?

2 个答案:

答案 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();