sql >> Databáze >  >> NoSQL >> MongoDB

Model měnící se za běhu s mongodb/mongoid

Obecně by mělo být možné aktualizovat staré dokumenty novými poli za běhu. V MongoDB není potřeba migrace.

Možná budete chtít napsat úlohy rake, abyste aktualizovali své staré dokumenty pomocí nových polí a výchozích hodnot.

Tyto dokumenty můžete zjistit kontrolou těch nových polí, která mají standardně nulovou hodnotu.

Aktualizovat

Snadný styl:

Pokud definujete nové pole s výchozí hodnotou, měla by se tato hodnota vždy používat, pokud nastavíte novou:

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

Pokud zadáte dotaz do databáze, měli byste získat výchozí hodnotu pro dokumenty, které toto pole nemají před vaším rozšířením:

(konzola kolejnic)

MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">

Testoval jsem to s čerstvým stackem rails s aktuálním mongoidem na Ruby 1.9.2 - mělo by to fungovat i s jinými stacky.

Složitější/složitější styl:

Pokud jste nenastavili výchozí hodnotu, dostanete pro toto nové pole nulu.

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

(konzola kolejnic)

MyModel.first
#=> #<MyModel …other fields…, note: nil>

Pak byste mohli nastavit úlohu rake a migrační soubor jako v tomto příkladu:

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

Spusťte tuto migraci pomocí rake mymodel:migrate .

Toto je pouze výchozí bod a můžete jej rozšířit na úplný migrační motor mongoidů.

task :migrate => :environment do … je nutné, jinak rake nenačte modely.



  1. Mongoose neukládá vnořený objekt

  2. mongoose .js model bez exportu, vyžadující ve složce prašník stále fungující schéma

  3. Jak zkontrolovat, zda existuje kolekce v MongoDB pomocí ovladače C#?

  4. MongoDB se nepřipojí k MongoHQ pomocí Mongoidu