2012-09-06 3 views
5

임의로 큰 숫자를 저장하는 MongoDB 문서의 필드가 있습니다. 나는 DBOBJECT (MongoDB를위한 자바 드라이버)로 검색 할 때, 나는 때때로는 ClassCastException으로 실행MongoDB/Java : DBObjects의 유형 안전

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

numericVal에 저장된 값은, 말하자면, 1234567890 인 경우, 롱 캐스팅이 성공합니다. 예를 들어 12345이면 DBObject.get()은 Double을 반환하고 캐스트가 실패합니다.

MongoDB DBObject를 직렬화 해제 할 때 유형 안전성을 보장하려면 어떻게해야합니까?

+0

당신에게 값이'12345'입니다 긍정적를? mongo와 함께 원시 값을 살펴볼 수있는 방법이 있습니까? JSON 표현이 있습니까? –

+0

쉘을 통해 12345로 입력했지만 쉘에서 인쇄하면 12345.0으로 표시됩니다. 분명히 그것은 파서 (자바 드라이버) 측에서 문제가되지만, 처음에는 mongo 측에서 어떻게 발생했는지 모르겠습니다. 즉, 나는 java 드라이버와 함께 일반적으로 타입 안전성을 유지하는 법을 알고 싶다. – ericsoco

답변

5

나는 오히려 캐스트 (롱)보다 유형 안전 getLong (문자열 키)를 사용하여 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이되고 두 번 회의적입니다. 다른 일이 여기에 있습니다.

+0

대신 인터페이스 BSONObject에 대한 문서를보고 있기 때문에 BasicBSONObject에서 형식 안정 getter가 표시되지 않았습니다. 그 점을 지적 해 주셔서 감사합니다. (자바 드라이버로 mongo 객체를 deserialize하는 방법을 보여주는 예제를 찾고 있었지만 아무 것도 찾을 수 없었습니다!) 그러나 그렇습니다. 확실히 여기에 뭔가가 있습니다 ... 입력 1234567890'numericVal' (쉘)은 일식 디버거에서 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();