ठीक है मैंने इसे पूरा किया। मुझे लगता है कि कुछ इस तरह से मोंगो कंसोल का उपयोग करने का एक तेज़ तरीका है: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
- तैनात करें और साइट को वापस लाएं
जैसा कि उल्लेख किया गया है, मुझे लगता है कि एक बेहतर तरीका है, इसलिए अगर किसी के पास कुछ सुझाव हैं तो कृपया साझा करें। धन्यवाद!