MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

डेटा खोए बिना Mongoid में फ़ील्ड का प्रकार बदलें

ठीक है मैंने इसे पूरा किया। मुझे लगता है कि कुछ इस तरह से मोंगो कंसोल का उपयोग करने का एक तेज़ तरीका है:MongoDB:किसी फ़ील्ड के प्रकार को कैसे बदलें?

लेकिन मैं रूपांतरण काम नहीं कर सका, इसलिए रेल कंसोल में अधिक डाउनटाइम के साथ इस धीमी विधि का चयन किया। अगर किसी के पास तेज़ समाधान है तो कृपया इसे पोस्ट करें।

  • नए नाम के साथ नया इंटीजर फ़ील्ड बनाएं, जैसे amount2
  • प्रत्येक amount को रूपांतरित करें amount2 . के लिए सही मान पर कंसोल या रेक टास्क में

Mongoid.identity_map_enabled = false
Transaction.all.each_with_index do |t,i|
  puts i if i%1000==0
  t.amount2 = t.amount.to_money
  break if !t.save
end

ध्यान दें कि .all.each ठीक काम करता है (आपको .find_each या .find_in_batches जैसे mysql के साथ नियमित सक्रिय रिकॉर्ड का उपयोग करने की आवश्यकता नहीं है) क्योंकि mongodb कर्सर की वजह से। जब तक पहचान_मैप बंद है तब तक यह मेमोरी नहीं भरेगा।

  • रखरखाव के लिए साइट को नीचे ले जाएं, किसी भी राशि फ़ील्ड को कैप्चर करने के लिए माइग्रेशन को एक बार और चलाएं जो पिछले कुछ मिनटों में बदल सकता था (कुछ ऐसा Transaction.where(:updated_at.gt => 1.hour.ago).each_with_index...

  • कमेंट आउट करें field :amount, type: BigDecimal अपने मॉडल में, आप नहीं चाहते कि मोंगोइड को अब इस क्षेत्र के बारे में पता चले, और इस कोड को आगे बढ़ाएं

  • अब अपने कॉलम का नाम बदलने के लिए एक और स्क्रिप्ट चलाएँ (यह प्रक्रिया में किसी भी पुराने BigDecimal स्ट्रिंग मान को अधिलेखित कर देता है)। आपको उस मॉडल पर अपने किसी भी सत्यापन पर टिप्पणी करने की आवश्यकता हो सकती है जो पुराने क्षेत्र की अपेक्षा करता है।

Mongoid.identity_map_enabled = false
Transaction.all.each_with_index do |t,i|
  puts i if i%1000==0
  t.rename :amount2, :amount
end

यह परमाणु है और इसके लिए मॉडल पर बचत की आवश्यकता नहीं है।

  • नए कॉलम प्रकार को दर्शाने के लिए अपना मॉडल अपडेट करें field :amount, type: Integer
  • तैनात करें और साइट को वापस लाएं

जैसा कि उल्लेख किया गया है, मुझे लगता है कि एक बेहतर तरीका है, इसलिए अगर किसी के पास कुछ सुझाव हैं तो कृपया साझा करें। धन्यवाद!




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडब कुंजी के साथ काम करने वाले किसी भी काम में . या $?

  2. मोंगोकक्स सी ++ ड्राइवर का उपयोग करके मोंगोडब दस्तावेज़ों को दोबारा कैसे उत्पन्न करें?

  3. mongoose - ObjectId जो उप-दस्तावेज़ का संदर्भ देता है

  4. मोंगो डीबी:अंतिम ज्ञात दस्तावेज़ के बाद सभी दस्तावेज़ सम्मिलित करें

  5. डोकर कंटेनर से स्थानीय मोंगोडब से जुड़ना