2009-11-19 103 views
22

我構建了一個使用MongoDB作爲後端和MongoMapper作爲ORM工具的Rails應用程序。假設在版本1中,我定義了以下型號:MongoMapper和遷移

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

在版本2的後面,我意識到我需要一個新的模型所需的密鑰。因此,在第2版,SomeModel現在看起來是這樣的:

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

我如何遷移我的所有現有數據,包括some_new_key?假設我知道如何爲所有現有文檔設置合理的默認值。進一步說,假設在版本3中,我意識到我真的不需要some_key。所以,現在的模型看起來像這樣

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

但這一切在我的數據庫中的現有記錄有some_key設置的值,它只是在這一點上浪費空間。我如何回收這個空間?

使用ActiveRecord,我可以創建遷移以添加some_new_key(在版本1 - >版本2遷移中)的初始值,並刪除some_key(在版本2 - >版本3遷移中)的值。

用MongoDB/MongoMapper做這件事的適當方法是什麼?在我看來,跟蹤哪些遷移已經運行的一些方法仍然是必要的。這樣的事情存在嗎?

編輯:我認爲人們錯過了我的問題。有時您希望能夠在數據庫上運行腳本來更改或重構其中的數據。上面給出了兩個示例,一個是添加了新的必需密鑰,另一個是可以移除密鑰並可以回收空間的示例。你如何管理這些腳本的運行? ActiveRecord遷移爲您提供了一種簡單的方法來運行這些腳本,並確定哪些腳本已經運行,哪些腳本尚未運行。我顯然可以編寫一個Mongo腳本來對數據庫進行任何更新,但是我期待的是一個像遷移這樣的框架,可以讓我跟蹤哪些升級腳本已經運行。

+0

我認爲Mongo(/ Mapper)可能對於這種事情太年輕了。 :/ – Konklone 2010-01-05 20:04:23

+0

由於Mongo DB實際上沒有任何模式,所以在模式方面的遷移實際上並不是一個適當的概念。您需要自己編寫數據遷移腳本。 – zsong 2012-01-26 21:39:44

回答

13

檢查Mongrations ...我剛讀完它,它看起來像你在做什麼。

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

http://github.com/terrbear/mongrations

乾杯! Kapslok

+1

對於Rails 3,請查看terrbear的mongrations這個分支:https://github.com/TheHiveProjects/mongrations。 (在撰寫本文時,這是具有最近提交的分支)。我必須指定'gem'mongrations',:git =>'git:// github.com/TheHiveProjects/mongrations.git'來獲取它上班。 – colllin 2012-02-20 04:36:57

-5

MongoDB是一個無模式數據庫。這就是爲什麼沒有遷移。在數據庫本身中,對象是否隨時都有鍵:some_key或鍵:some_other_key並不重要。

MongoMapper試圖強制執行一些限制,但由於數據庫非常靈活,您將不得不自己維護這些限制。如果您需要每個對象上的一個鍵,請確保您運行一個腳本來更新預先存在的對象上的這些鍵,或者處理在碰到它們時沒有該鍵的對象。

我對MongoDB本人相當陌生,但據我所見,由於無模式數據庫的靈活性,因此您需要如何處理它。

+9

我對這個問題抱有疑問:「MongoDB是一個無模式數據庫,這就是爲什麼沒有遷移的原因。」 雖然MongoDB並未在您的文檔中實施架構,但實際上您可能希望您的應用程序在某種程度上強制執行架構。 如果您更廣泛地定義「遷移」,可以很容易地看到MongoDB支持的Web應用程序可能需要遷移。確實,一種遷移是「正式的」模式遷移。但還有其他類型的遷移仍然非常重要:添加密鑰,重命名密鑰,更改數據等。 – 2010-02-23 21:51:00

+11

數據轉換是遷移。 MongoDB有數據。 – 2010-04-20 19:07:49

1

一種選擇是使用update操作一次更新所有數據。多版本更新在開發版本中是新的,因此您需要使用其中的一種。

-1

我敢打賭,你可以勾選Activerecord :: Miration來自動化和跟蹤你的「遷移」腳本。

0

克林特,

您可以編寫代碼來執行更新 - 儘管這似乎是更新基於自身領域的紀錄不被支持。

在這種情況下,我做了以下並運行它針對服務器:

------------------------------ 
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

我們只是建立這一個:https://github.com/eberhara/mongration - 這是一個普通節點模塊(你可以找到它NPM)。

我們需要一個很好的mongodb遷移框架,但找不到任何 - 所以我們建立了一個。

它擁有比普通移民框架更完善的功能很多的:

  • 校驗(發佈時previosuly跑遷移不匹配其舊版本錯誤)
  • 持續遷移狀態蒙戈(有沒有固定的狀態文件)
  • 到副本全面支持設置
  • 自動把手回滾(開發商必須指定回滾過程)
  • 能力MULTIP運行樂遷移的同時(同步或異步)
  • 能夠在同一時間

希望它可以幫助運行不同數據庫的遷移!