Secara umum, mungkin untuk memperbarui dokumen lama dengan bidang baru saat runtime. Tidak perlu migrasi di MongoDB.
Anda mungkin ingin menulis tugas menyapu untuk memperbarui dokumen lama Anda dengan bidang baru dan nilai default.
Anda dapat mengetahui dokumen-dokumen ini dengan memeriksa bidang-bidang baru yang memiliki nilai nol per default.
Perbarui
Gaya yang mudah:
Jika Anda menentukan bidang baru dengan nilai default, nilai ini harus selalu digunakan selama Anda menetapkan yang baru:
app/models/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
Jika Anda menanyakan database Anda, Anda harus mendapatkan nilai default untuk dokumen yang tidak memiliki bidang ini sebelum ekstensi Anda:
(rel konsol)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
Saya menguji ini dengan tumpukan Rails baru dengan mongoid saat ini di Ruby 1.9.2 - harus bekerja dengan tumpukan lain juga.
Gaya yang lebih rumit/kompleks:
Jika Anda tidak menetapkan nilai default, Anda akan mendapatkan nil untuk bidang baru ini.
app/models/my_model.rb
class MyModel
include Mongoid::Document
field :name, type: String
field :data, type: String
# NEW FIELD
field :note, type: String
end
(rel konsol)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
Kemudian Anda dapat mengatur tugas menyapu dan file migrasi seperti dalam contoh ini:
lib/tasks/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
Jalankan migrasi ini dengan rake mymodel:migrate
.
Ini hanya titik awal dan Anda dapat memperluasnya ke mesin migrasi mongoid penuh.
task :migrate => :environment do …
diperlukan, jika tidak, rake tidak akan memuat model.