sql >> Databasteknik >  >> NoSQL >> MongoDB

Körtidsföränderlig modell med mongodb/mongoid

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.



  1. importerar CSV-fil MongoDB med ISODate

  2. mongodb-fråga utan fältnamn

  3. Redis vs Service Bus för pub/underscenario

  4. Optimala plugins och projekt för att använda IntelliJ IDEA för JavaScript?