sql >> Database >  >> NoSQL >> MongoDB

Runtime veranderend model met mongodb/mongoid

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.



  1. bouw een API voor het streamen van audio/video van GridFS mongodb

  2. Hoe geneste $ lookup zoeken in MongoDB?

  3. Identificeer het laatste document van MongoDB find() resultatenset

  4. mongoDB-query voor ophalen uit geneste arrayverzameling