2013-02-13 17 views
5

के रूप में संग्रहीत हैं, ऐसा लगता है कि अब कुछ समय लगता है कि मैं अपने दशमलव को तारों के रूप में संग्रहीत कर रहा हूं। यह अब एक समस्या है क्योंकि मुझे कुछ गणना करने के लिए एकत्रीकरण ढांचे का उपयोग शुरू करने की आवश्यकता है।मोंगो सभी संख्यात्मक फ़ील्ड को कनवर्ट करें जो स्ट्रिंग

वहाँ, मेरे संग्रह में प्रत्येक दस्तावेज़ चलने के लिए और isNaN के लिए प्रत्येक मान की जाँच, और अगर झूठे साथ parseFloat

उत्तर

6

कुछ इस तरह संग्रहीत मोंगो खोल से काम करना चाहिए कोई तरीका है:

db.yourCollection.find({}).forEach(function(doc) { 
    if(isNaN(doc.xyz)) { 
     print('found string: ' + doc._id); 
     db.yourCollection.update( 
      { _id: doc._id}, 
      { $set : { "xyz" : parseFloat(doc.xyz) } } 
     ) 
    } 
}) 

यह प्रत्येक दस्तावेज़ के माध्यम से loops, जैसा कि आपने सुझाव दिया है isNaN का उपयोग करता है, फिर $sets वर्तमान दस्तावेज़ के लिए parseFloat मान का मान।

+1

mongodb 2.2 के रूप में, अद्यतन पहले पैरा के रूप में एक क्वेरी लेता है, इसलिए doc._id के बजाय {_id: doc._id}। –

+0

'isNaN (doc.xyz)' के बजाय आपको अपने टाइपिंग "123" या "3456" होने पर 'typeof doc.xyz ==' string'' का उपयोग करना चाहिए। – ov1d1u

+1

@ ov1d1u - मूल प्रश्न हालांकि विशेष रूप से 'isNaN' का उपयोग करने के बारे में पूछा गया, इसलिए मैंने इसे चुना। – WiredPrairie

2

आपकी प्रतिक्रिया के लिए धन्यवाद। मैं अपने प्रारंभिक प्रश्न में अस्पष्ट था कि मैं संख्याओं को अद्यतन करने के लिए फ़ील्ड निर्दिष्ट नहीं करना चाहता था, बल्कि प्रत्येक संपत्ति को चलाता हूं और चेक करता हूं।

मैं एक साथ इस छोटे से समारोह डाल दिया है चाल करने के लिए:

var cursor = db.results.find(); 
while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    for (key in doc) { 
     if (key.match(/^metric_.*/i) && !isNaN(doc[key])) { 
      doc[key] = parseFloat(doc[key]); 
      db.results.update({ _id : doc._id }, doc); 
     } 
    } 
} 

दो बातें ध्यान रखें:

  1. यह केवल गुण के पहले स्तर पर जांच और रूपांतरण करता है। इसे गहराई से जाने के लिए आसानी से संशोधित किया जा सकता है, लेकिन इस समय मुझे इसकी आवश्यकता थी।
  2. यह फ़ंक्शन आपके दिनांक मूल्यों को दूर कर देगा !!! एक जावास्क्रिप्ट दिनांक का मूल्यांकन isNaN द्वारा गलत के रूप में किया जाता है, और इसलिए इसे एक संख्या के रूप में माना जाएगा। मेरे मामले में, parseFloat का उपयोग करके वास्तव में मान को isNaN पर सेट कर दिया जाएगा। फिर, दर्शक के लिए एक बहुत ही आसान फिक्स, लेकिन मैं बस उस अस्वीकरण प्रदान करना चाहता था।

आशा है कि यह मेरी स्थिति में किसी और की सहायता करेगी।