2012-09-06 15 views
5

MongoDB文書に任意に大きな数値を格納するフィールドがあります。私はDBObjectを(MongoDBのためのJavaドライバ)として、それを取得すると、私は時々にClassCastExceptionに実行します。numericValに格納された値は、たとえば、1234567890である場合MongoDB/Java:DBObjectsの型安全性

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

、ロングへのキャストは成功します。例えば12345の場合、DBObject.get()はDoubleを返し、キャストは失敗します。

MongoDB DBObjectsを逆シリアル化する際に、型の安全性を保証するにはどうすればよいですか?

+0

あなたは値が '12345'正ですか? mongoに未加工価値を見るための方法がいくつかありますか?それにはJSON表現がありますか? –

+0

シェルから12345として入力しましたが、シェルでプリントすると12345.0と表示されます。明らかにそれはパーサ(Javaドライバ)側の問題ですが、最初はmongo側でどうなったのか分かりません。それは、私はどのようにjavaドライバとタイプの安全性を維持する方法を知りたいと思います。 – ericsoco

答えて

5

キャスト(ロング)ではなくタイプセーフなgetLong(Stringキー)を使用して、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

では、代わりにBSONObjectインターフェイスのドキュメントを見ていたので、BasicBSONObjectの型セーフなゲッターが表示されませんでした。それを指摘してくれてありがとう。 (Javaのドライバでmongoオブジェクトを非直列化する方法を示すが、何も見つからない例を探していた)しかし、確かにここには何か他に進んでいる...入力1234567890 'numericVal'シェル)は、Eclipseデバッガで1.234567890E9となります。これはDoubleとしても出てきます。まもなく返されます。 – ericsoco

+0

'getLong()'はうまくいきました。シェルとドライバの間の型変換に何があったのか知らないが、今は気にしない;) – 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(); 
関連する問題