5

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

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

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

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

4

2 回答 2

5

我认为您可以通过使用类型安全的 getLong(String key) 而不是强制转换 (Long) 来避免 ClassCastException,并希望自动装箱能做正确的事情来让您减少“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 成为 Double 持怀疑态度。这里还有其他事情发生。

于 2012-09-06T17:45:30.943 回答
4

一般来说,我注意到使用 shell(或有时使用其他语言)将数值作为双精度插入

例如:

db.dummycollection.update({"mykey" : 100}, { $set : { "millisecage" : 30000000 }})

插入一个双精度值 (30000000.0) 但

db.dummycollection.update({"mykey" : 100}, { $set : { "millisecage" : NumberLong(30000000) }})

在集合中插入正确的值

因此,如果您有疑问,请避免这种类型的转换,或者您可以执行以下操作:

Long myValue = ((Number) obj.get("yourkey")).longValue();
于 2013-10-18T10:52:05.373 回答