Ogólnie powinno być możliwe aktualizowanie starych dokumentów o nowe pola w czasie wykonywania. Nie ma potrzeby migracji w MongoDB.
Być może chcesz napisać zadania prowizji, aby zaktualizować stare dokumenty o nowe pola i wartości domyślne.
Możesz znaleźć te dokumenty, sprawdzając te nowe pola, które domyślnie mają wartość zerową.
Aktualizacja
Prosty styl:
Jeśli zdefiniujesz nowe pole z wartością domyślną, ta wartość powinna być zawsze używana, o ile ustawisz nowe:
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
Jeśli wysyłasz zapytanie do bazy danych, powinieneś otrzymać domyślną wartość dla dokumentów, które nie mają tego pola przed rozszerzeniem:
(konsola szynowa)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
Przetestowałem to ze świeżym stosem szyn z aktualnym mongoidem na Ruby 1.9.2 - powinien działać również z innymi stosami.
Bardziej skomplikowany/złożony styl:
Jeśli nie ustawiłeś wartości domyślnej, dostaniesz zero dla tego nowego pola.
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
(konsola szynowa)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
Następnie możesz skonfigurować zadanie rake i plik migracji, jak w tym przykładzie:
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
Uruchom tę migrację za pomocą rake mymodel:migrate
.
To tylko punkt wyjścia i możesz go rozszerzyć na pełny silnik migracji mongoidów.
task :migrate => :environment do …
jest konieczne, w przeciwnym razie rake nie załaduje modeli.