सामान्य तौर पर रनटाइम पर पुराने दस्तावेज़ों को नए फ़ील्ड के साथ अपडेट करना संभव होना चाहिए। MongoDB में माइग्रेशन की कोई आवश्यकता नहीं है।
हो सकता है कि आप अपने पुराने दस्तावेज़ों को नए फ़ील्ड और डिफ़ॉल्ट मानों के साथ अपडेट करने के लिए रेक कार्य लिखना चाहें।
आप उन नए क्षेत्रों की जाँच करके इन दस्तावेज़ों का पता लगा सकते हैं जिनका डिफ़ॉल्ट रूप से शून्य मान है।
अपडेट करें
आसान शैली:
यदि आप किसी नए फ़ील्ड को डिफ़ॉल्ट मान के साथ परिभाषित करते हैं, तो यह मान हमेशा तब तक उपयोग किया जाना चाहिए जब तक आप एक नया सेट करते हैं:
ऐप/मॉडल/my_model.rb
class MyModel
include Mongoid::Document
field :name, type: String
field :data, type: String
# NEW FIELD
field :note, type: String, default: "no note given so far!"
end
यदि आप अपने डेटाबेस को क्वेरी करते हैं तो आपको उन दस्तावेज़ों के लिए अपना डिफ़ॉल्ट मान प्राप्त करना चाहिए जिनमें आपके एक्सटेंशन से पहले यह फ़ील्ड नहीं है:
(रेल कंसोल)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
मैंने रूबी 1.9.2 पर एक मौजूदा मोंगोइड के साथ एक ताजा रेल स्टैक के साथ इसका परीक्षण किया - अन्य ढेर के साथ भी काम करना चाहिए।
अधिक जटिल/जटिल शैली:
यदि आपने कोई डिफ़ॉल्ट मान सेट नहीं किया है, तो आपको इस नई फ़ील्ड के लिए शून्य मिलेगा।
ऐप/मॉडल/my_model.rb
class MyModel
include Mongoid::Document
field :name, type: String
field :data, type: String
# NEW FIELD
field :note, type: String
end
(रेल कंसोल)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
फिर आप इस उदाहरण की तरह एक रेक कार्य और माइग्रेशन फ़ाइल सेट कर सकते हैं:
lib/कार्य/my_model_migration.rake:
namespace :mymodel do
desc "MyModel migration task"
task :migrate => :environment do
require "./db/migrate.rb"
end
end
db/migrate.rb:
olds = MyModel.where(note: nil)
# Enumerator of documents without a valid :note field (= nil)
olds.each do |doc|
doc.note = "(migration) no note given yet"
# or whatever your desired default value should be
doc.save! rescue puts "Could not modify doc #{doc.id}/#{doc.name}"
# the rescue is only a failsafe statement if something goes wrong
end
इस माइग्रेशन को rake mymodel:migrate
. के साथ चलाएं ।
यह केवल एक प्रारंभिक बिंदु है और आप इसे एक पूर्ण मोंगोइड माइग्रेशन इंजन तक बढ़ा सकते हैं।
task :migrate => :environment do …
आवश्यक है, अन्यथा रेक मॉडल लोड नहीं करेगा।