2012-07-01 14 views
5

से पूर्णांक एक MongoDB क्षेत्र का प्रकार बदलें हम एक आवेदन है कि MongoDB में सी/C++ से कुछ कॉन्फ़िगरेशन मान संग्रहीत करता है और (यानी यह थोड़ी देर के लिए चलाता है, कोई आवेदन व्यवधान क्षमता को पुन: प्रारंभ हो गया है है, कॉन्फ़िगरेशन को बदलता है, फिर ऐप को फिर से चलाता है, और यह कहां से निकलता है)। यह बुलियन और स्ट्रिंग कॉन्फ़िगरेशन के लिए एक आकर्षण की तरह काम करता है।अपनी सांत्वना

लेकिन तब हम कुछ पूर्णांक (- 32 बिट मूल्यों हमारे वर्तमान सी में/C++ कार्यान्वयन) है। और जब मैं उन पूर्णांक मानों को संशोधित करने के लिए मोंगो डीबी कंसोल का उपयोग करता हूं, तो मोंगो हमेशा उन्हें संख्या के रूप में वापस स्टोर करता है (जो सी/सी ++ कार्यान्वयन में डोलबल है)। हम ऐप को दोहरे मान लेने के लिए बदल देंगे जहां यह पूर्णांक की अपेक्षा करता है लेकिन मैं सोच रहा था कि मोंगो को अपने जावास्क्रिप्ट कंसोल से पूर्णांक स्टोर करने के लिए मजबूर करने का कोई तरीका है या नहीं।

कोई सुझाव?

+0

parseFloat() का उपयोग करने के रूप में मानों को पुन: सहेजें या मूल्य – Sammaye

+1

के आस-पास कोई भाषण चिह्न न डालें असल में parseInt() क्षमा करें – Sammaye

उत्तर

9

C/C++ "शब्द के अर्थ" में, ints not actually guaranteed 32-बिट मान होना करने के लिए कर रहे हैं। एक int कम से कम 16-बिट होना चाहिए, लेकिन आमतौर पर प्लेटफ़ॉर्म आर्किटेक्चर से मेल खाता है (उदाहरण के लिए 32 या 64 बिट)।

@Jasd से उल्लेख किया है, जावास्क्रिप्ट केवल एक सांख्यिक प्रकार है जो एक चल बिन्दु (सी में double) है है।

मोंगोडीबी खोल से आप बीएसओएन 64-बिट पूर्णांक प्राप्त करने के लिए BSON 32-bit integer value या NumberLong(..) प्राप्त करने के लिए NumberInt(..) कार्यों का उपयोग करने में सक्षम होना चाहिए।

+1

int आकार के बारे में अच्छी पकड़ लें! –

+0

नोट मुद्दा https://jira.mongodb.org/browse/SERVER-5424 – nikow

0

MongoDB के खोल के लिए JavaScript इंजन द्वारा संचालित है। और जावास्क्रिप्ट के पास integer के लिए कोई प्रकार नहीं है। यह केवल Number जानता है, जो फ़्लोटिंग-पॉइंट नंबरों के लिए एक प्रकार है।
आप MongoDB प्रकार NumberLong उपयोग करने का प्रयास कर सकते हैं, लेकिन यह मेरे लिए ऐसा नहीं हो पाया जब मैं एक बार में एक ही समस्या थी।

8

आप की तरह कुछ के साथ कंसोल पर एक निश्चित क्षेत्र के लिए सभी मूल्यों के प्रकार को ठीक कर सकते हैं:

db.Statistic.find({kodoId: {$exists: true}}).forEach(function (x) { 
    x.kodoId = NumberInt(x.kodoId); 
    db.Statistic.save(x); 
}); 

यह होगा kodoId क्षेत्र है और उन्हें int और पुन: सहेज में बदलने का है कि केवल लोड दस्तावेजों। एक दूसरे परम

db.Statistic.find({kodoId: {$exists: true}}, {kodoId: 1}).forEach(function (x) { 
    db.Statistic.update({ _id: x._id }, 
     {$set: { 
     kodoId: NumberInt(x.kodoId) 
     }}); 
}); 

जो केवल लोड kodoId मूल्य (उम्मीद एक सूचकांक से): आप की तरह कुछ कर सकता है। यह बहुत तेज़ होना चाहिए क्योंकि इसे पूरे दस्तावेज़ को लोड और सहेजने की आवश्यकता नहीं है - बस वह एक फ़ील्ड।

+0

आप को जोड़ने के लिए था हो सकता है एक 'कोशिश .. पकड़ (गलती) 'मामले में 2 उदाहरण के आसपास वहाँ कुछ मान जो पहले से ही यह बाद से NumberInt हैं एक त्रुटि फेंक देगा। –

+0

मेरे लिए एक आकर्षण की तरह काम किया। धन्यवाद! –

संबंधित मुद्दे