Over het algemeen moet het mogelijk zijn om oude documenten tijdens runtime bij te werken met de nieuwe velden. Er is geen noodzaak voor migraties in MongoDB.
Misschien wil je rake-taken schrijven om je oude documenten bij te werken met de nieuwe velden en standaardwaarden.
U kunt deze documenten achterhalen door de nieuwe velden aan te vinken die standaard een nulwaarde hebben.
Bijwerken
Eenvoudige stijl:
Als u een nieuw veld met een standaardwaarde definieert, moet deze waarde altijd worden gebruikt zolang u een nieuw veld instelt:
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
Als u uw database opvraagt, zou u uw standaardwaarde moeten krijgen voor documenten die dit veld niet hebben vóór uw extensie:
(railconsole)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
Ik heb dit getest met een nieuwe rails-stack met een huidige mongoïde op Ruby 1.9.2 - zou ook met andere stacks moeten werken.
Meer gecompliceerde/complexe stijl:
Als je geen standaardwaarde hebt ingesteld, krijg je nul voor dit nieuwe veld.
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
(railconsole)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
Dan zou je een rake-taak en migratiebestand kunnen opzetten zoals in dit voorbeeld:
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
Voer deze migratie uit met rake mymodel:migrate
.
Dit is slechts een beginpunt en u kunt dit uitbreiden tot een volledige mongoïde migratie-engine.
De task :migrate => :environment do …
is noodzakelijk, anders laadt de hark geen modellen.