2012-09-06 63 views
5

我在MongoDB文檔中有一個字段,它存儲了一個任意大的數字。當我找回它作爲一個DBOBJECT(Java驅動程序MongoDB的),我有時會碰上一個ClassCastException:MongoDB/Java:DBObject中的類型安全

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

如果存儲在numericVal值,也就是說,1234567890,投龍成功。如果它是,例如12345,DBObject.get()返回一個Double,並且轉換失敗。

如何在反序列化MongoDB DBObjects時確保類型安全?

+0

你正值爲'12345'? mongo有什麼方法來查看原始值 - 它是否具有JSON表示? –

+0

我通過shell作爲12345輸入它,但是當我在shell中打印它時,它顯示爲12345.0。顯然這是解析器(java驅動程序)方面的問題,但我不知道它是如何發生在mongo方面的。那就是說,我想知道如何通過java驅動程序來保持類型安全。 – ericsoco

回答

5

我認爲你可以通過使用類型安全的getLong(String key)而不是cast(Long)來避免ClassCastException,並且希望自動裝箱功能能夠讓你的操作變得「長」。

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變成雙重的。這裏還有別的事情要做。

+0

沒有在BasicBSONObject中看到類型安全的getter,因爲我正在查看接口BSONObject的文檔。感謝您指出了這一點。 (正在尋找一個應該顯示如何使用java驅動程序反序列化mongo對象但無法找到任何東西的示例!)但是,確實,這裏肯定還有別的東西在輸入1234567890 for'numericVal'(在shell)在eclipse調試器中變成1.234567890E9,它也以Double形式出現。將很快回報... – ericsoco

+0

'getLong()'很好。不知道shell和驅動程序之間的類型轉換是什麼,但現在我不在乎;) – ericsoco

4

一般我注意到,數字值被插入作爲雙用殼(或有時使用其他語言)

因此,例如:

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