MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Model zmieniający środowisko wykonawcze za pomocą mongodb/mongoid

Ogólnie powinno być możliwe aktualizowanie starych dokumentów o nowe pola w czasie wykonywania. Nie ma potrzeby migracji w MongoDB.

Być może chcesz napisać zadania prowizji, aby zaktualizować stare dokumenty o nowe pola i wartości domyślne.

Możesz znaleźć te dokumenty, sprawdzając te nowe pola, które domyślnie mają wartość zerową.

Aktualizacja

Prosty styl:

Jeśli zdefiniujesz nowe pole z wartością domyślną, ta wartość powinna być zawsze używana, o ile ustawisz nowe:

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

Jeśli wysyłasz zapytanie do bazy danych, powinieneś otrzymać domyślną wartość dla dokumentów, które nie mają tego pola przed rozszerzeniem:

(konsola szynowa)

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

Przetestowałem to ze świeżym stosem szyn z aktualnym mongoidem na Ruby 1.9.2 - powinien działać również z innymi stosami.

Bardziej skomplikowany/złożony styl:

Jeśli nie ustawiłeś wartości domyślnej, dostaniesz zero dla tego nowego pola.

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

(konsola szynowa)

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

Następnie możesz skonfigurować zadanie rake i plik migracji, jak w tym przykładzie:

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

Uruchom tę migrację za pomocą rake mymodel:migrate .

To tylko punkt wyjścia i możesz go rozszerzyć na pełny silnik migracji mongoidów.

task :migrate => :environment do … jest konieczne, w przeciwnym razie rake nie załaduje modeli.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zignorować niezdefiniowane wartości, które są przekazywane w parametrze obiektu zapytania dla funkcji Znajdź Mongoose?

  2. Pymongo znajduje wartość w poddokumentach

  3. MongoRepository @Query Nie udało się przeanalizować ciągu jako daty

  4. MongoDB $przełącznik

  5. MongoDB Relacja jeden do wielu