2012-09-06 14 views
5

में सुरक्षा टाइप करें मेरे पास एक मोंगोडीबी दस्तावेज़ में एक फ़ील्ड है जो मनमाने ढंग से बड़ी संख्या में स्टोर करता है। जब मैं एक DBObject (MongoDB के लिए जावा चालक) के रूप में इसे पुनः प्राप्त है, मैं कभी कभी एक ClassCastException में चलाने:मोंगोडीबी/जावा: DBObjects

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

तो numericVal में संग्रहीत मूल्य, कहते 1234567890 है, लंबे समय के लिए डाली सफल होता है। यदि ऐसा है, तो कहें, 12345, DBObject.get() एक डबल देता है, और कलाकार विफल रहता है।

मैं MongoDB DBObjects को deserializing करते समय टाइप सुरक्षा कैसे सुनिश्चित कर सकता हूं?

+0

आप सकारात्मक मूल्य 'है 12345' कर रहे हैं? कच्चे मूल्य को देखने के लिए मोंगो के साथ कोई रास्ता है - क्या इसमें JSON प्रतिनिधित्व है? –

+0

मैंने इसे खोल के माध्यम से 12345 के रूप में दर्ज किया, लेकिन जब मैं इसे खोल में प्रिंट करता हूं तो यह 12345.0 के रूप में दिखाई देता है। जाहिर है कि पार्सर (जावा चालक) पक्ष पर यह एक मुद्दा है, लेकिन मुझे नहीं पता कि यह पहली जगह में मोन्गो पक्ष पर कैसा हुआ। उस ने कहा, मैं जानना चाहता हूं कि सामान्य रूप से जावा चालक के साथ प्रकार की सुरक्षा को कैसे बनाए रखा जाए। – ericsoco

उत्तर

5

मुझे लगता है कि आप क्लासकास्ट अपवाद से कास्ट (लांग) के बजाय सुरक्षित getLong (स्ट्रिंग कुंजी) का उपयोग करके बच सकते हैं और आशा करते हैं कि ऑटोबॉक्सिंग आपको 'एल' लंबे समय तक ले जाने के लिए सही चीज करता है।

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 में टाइप-सुरक्षित गेटर्स नहीं दिखाई दिए क्योंकि मैं इसके बजाय इंटरफ़ेस BSONObject के दस्तावेज़ों को देख रहा था। यह बात बताने के लिए धन्यवाद। (एक उदाहरण की तलाश में था जो दिखाता है कि जावा चालक के साथ मोंगो ऑब्जेक्ट्स को कैसे बेकार करना है लेकिन कुछ भी नहीं मिला!) हालांकि, हाँ, निश्चित रूप से यहां कुछ और चल रहा है ... 'numericVal' के लिए 1234567890 दर्ज करना (में खोल) ग्रहण डीबगर में 1.234567890E9 के रूप में बदल जाता है, जो एक डबल के रूप में भी आता है। जल्द ही रिपोर्ट करेगा ... – 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();