I allmänhet bör det vara möjligt att uppdatera gamla dokument med de nya fälten under körning. Det finns inget behov av migrering i MongoDB.
Du kanske vill skriva rake-uppgifter för att uppdatera dina gamla dokument med de nya fälten och standardvärdena.
Du kan ta reda på dessa dokument genom att markera de nya fälten som har ett nollvärde som standard.
Uppdatera
Enkel stil:
Om du definierar ett nytt fält med ett standardvärde ska detta värde alltid användas så länge du ställer in ett nytt:
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
Om du frågar efter din databas bör du få ditt standardvärde för dokument som inte har detta fält före din tillägg:
(skenkonsol)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
Jag testade detta med en ny rails-stack med en aktuell mongoid på Ruby 1.9.2 - borde fungera med andra stackar också.
Mer komplicerad/komplex stil:
Om du inte har angett ett standardvärde får du noll för detta nya fält.
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
(skenkonsol)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
Sedan kan du ställa in en rake-uppgift och migreringsfil som i det här exemplet:
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
Kör den här migreringen med rake mymodel:migrate
.
Detta är bara en utgångspunkt och du kan utöka detta till en full mongoid-migreringsmotor.
task :migrate => :environment do …
är nödvändigt, annars kommer rake inte att ladda modeller.