2009-11-19 21 views
22

MongoDB'yi arka uç olarak ve ORM aracı olarak MongoMapper kullanarak bir Rails uygulaması yapıyorum.MongoMapper ve geçişler

class SomeModel 
    include MongoMapper::Document 
    key :some_key, String 
end 

Daha sonra 2. sürümünde, ben modeline yeni bir gerekli anahtara ihtiyacınız olduğunu fark: sürüm 1'de varsayalım, ben şu modeli tanımlar. Yani, 2. sürümünde, SomeModel şimdi şöyle görünür:

class SomeModel 
    include MongoMapper::Document 
    key :some_key, String 
    key :some_new_key, String, :required => true 
end 

nasıl some_new_key içerecek şekilde tüm mevcut verileri taşı? Mevcut tüm belgeler için makul bir varsayılan değerin nasıl ayarlanacağını biliyorum. Bunu bir adım daha ileri götürerek, 3. sürümde, gerçekten bir tuşa ihtiyacım olmadığını anlıyorum. Yani, şimdi modeli benim veritabanında mevcut tüm kayıtlar some_key için belirlenen değerlere sahip bu

class SomeModel 
    include MongoMapper::Document 
    key :some_new_key, String, :required => true 
end 

Ama benziyor ve sadece bu noktada uzay harcıyorsun. O alanı nasıl geri alabilirim?

ActiveRecord ile, bazı_new_key öğelerinin (sürüm1 -> sürüm2 geçişinde) başlangıç ​​değerlerini eklemek ve bazı_key (sürüm2 -> sürüm3 geçişinde) değerlerini silmek için yeni geçişler oluşturdum.

MongoDB/MongoMapper ile bunun için uygun yol nedir? Bana öyle görünüyor ki, hangi geçişlerin yürütüldüğü bazı izleme yöntemleri hala gerekli. Böyle bir şey var mı? EDIT: Bence insanlar benim sorumu kaçırıyorlar diye düşünüyorum. Verileri değiştirmek veya yeniden yapılandırmak için bir veritabanında bir komut dosyası çalıştırabilmek istediğiniz zamanlar vardır. Yukarıdaki iki örnek verdim, yeni bir anahtarın eklendiği ve bir anahtarın kaldırılabildiği ve alanın geri alınabileceği bir örnek verdim. Bu komut dosyalarını çalıştırmayı nasıl yönetiyorsunuz? ActiveRecord geçişleri, bu komut dosyalarını çalıştırmanın ve hangi komut dosyalarının daha önce çalıştırıldığını ve hangi komut dosyalarının çalıştırılmadığını belirlemek için kolay bir yol sağlar. Açıkçası, veritabanında herhangi bir güncelleme yapan bir Mongo betiği yazabilirim ama aradığım şey, hangi yükseltme komut dosyalarının zaten çalıştırıldığını izlememe izin veren geçişler gibi bir çerçevedir.

+0

Bence Mongo (/ Mapper) bu tür şeyler için çok genç olabilir. :/ – Konklone

+0

Mongo DB'nin aslında herhangi bir şeması olmadığı için, şema açısından geçiş aslında Mongo DB'de uygun bir kavram değildir. Veri taşıma komut dosyasını kendiniz yazmanız gerekiyor. – zsong

cevap

13

Mongrations'lara göz atın ... Sadece bu konu hakkında okumayı bitirdim ve neyin peşinde olduğunuza benziyor.

http://terrbear.org/?p=249

http://github.com/terrbear/mongrations

Şerefe! Kapslok

+1

Raylar 3 için, terrbear'ın montaglerinin bu çatalına bakın: https://github.com/TheHiveProjects/mongrations. (Bu yazıya göre, en son işi olan çataldır.) 'Gem' mongrations 'belirtmek zorunda kaldım,: git =>' git: // github.com/TheHiveProjects/mongrations.git ' çalışmak. – colllin

-5
MongoDB şema içermeyen bir veritabanıdır. Bu yüzden göç yok. Veritabanında, nesnenin anahtarı olup olmadığı önemli değildir: some_key veya anahtar: some_other_key herhangi bir zamanda.

MongoMapper bu konuda bazı kısıtlamalar uygulamaya çalışır, ancak veritabanı çok esnek olduğu için, bu kısıtlamaları kendiniz korumanız gerekir. Her nesnede bir anahtara ihtiyacınız varsa, önceden var olan nesnelerdeki bu anahtarları güncellemek için bir komut dosyası çalıştırdığınızdan emin olun veya bu anahtarın karşısına geldiğinde o anahtara sahip olmayan bir nesnenin durumunu ele alın.

MongoDB'ye kendimden çok yeni geldim, ancak görebildiğim kadarıyla, şema içermeyen db'nin esnekliğinden dolayı, bunun nasıl ele alınması gerektiği de budur.

+9

Bu argümanla ilgili sorun yaşıyorum: "MongoDB şema içermeyen bir veritabanıdır. Bu yüzden geçiş yok." MongoDB belgeleriniz arasında bir şema uygulamamasına rağmen, uygulamada muhtemelen uygulamanızın bir şemayı bir dereceye kadar zorlamasını isteyeceksiniz. "Migration" öğesini biraz daha geniş bir şekilde tanımlarsanız, MongoDB destekli bir Web uygulamasının geçişlere nasıl ihtiyaç duyacağını görmek kolaydır. Bir tür göçün “resmi” bir şema göçü olduğu doğrudur.Ancak, hala çok önemli olan başka türden geçişler de vardır: anahtarlar ekleme, anahtarları yeniden adlandırma, veri değiştirme vb. –

+11

Veri dönüşümleri geçişlerdir. MongoDB'nin verileri var. –

1

Tek bir seçenek, tüm verilerinizi bir kerede güncellemek için update işlemini kullanmanızdır. Çoklu güncelleme, geliştirme sürümlerinde yenidir, bu yüzden bunlardan birini kullanmanız gerekir.

-1

"Geçiş" komut dosyalarınızı otomatikleştirmek ve izlemek için Activerecord :: Miration'a bağlanabilirsiniz.

0

Clint,

Sen güncelleştirmeleri yapmak için kod yazabilirsiniz - kendi alanları dayalı bir kayıt güncelleme için desteklenmez görünüyor olsa.

Böyle bir durumda, aşağıdaki yaptım ve sunucu karşı ran:

------------------------------ 
records = Patient.all() 

records.each do |p| 
    encounters = p.encounters 
    if encounters.nil? || encounters.empty? 
    mra = p.updated_at 
    #puts "\tpatient...#{mra}" 
    else 
    mra = encounters.last.created_at 
    #puts "\tencounter...#{mra}" 
    end 
    old = p.most_recent_activity 
    p.most_recent_activity = mra 
    p.save! 
    puts "#{p.last_name} mra: #{old} now: #{mra}" 
end 
------------------------------ 
1

Biz sadece bu build:

Exodus Mongo için çok güzel bir göç çerçevesidir, istediğin bu olabilir NPM).

İyi bir mongodb göçü yapısına ihtiyacımız vardı, ancak bulamadık - bu yüzden bir tane oluşturduk.

O çok düzenli göç çerçeveler daha iyi özelliklerin var

  • Checksum
  • Mongo için göç durumunu ısrarla (a previosuly eski sürümü eşleşmiyor göç ran bir hata verir) (var düzenli devlet dosyası) çoğaltma için
  • tam destek
  • Otomatik sap rollbacks (geliştiriciler geri alma prosedürleri belirtmelidir) multip çalıştırmak için
  • Yetenek setleri le göçler aynı anda (senkron veya zaman uyumsuz)

Umarım yardımcı olur, aynı zamanda farklı veritabanları karşı göçler çalıştırmak için

  • Yetenek!

  • İlgili konular