2011-09-30 50 views

回答

5

更新:測試,這並不以目前的形式工作,它得到了正確的想法去的,我有一個單一的遷移具有相當的調整的工作模塊本身。但是我沒有看到它沒有發生重大變化就能按預期工作,並以某種方式跟蹤不同模式。


聽起來像是你想貓鼬數據的遷移

其目的是作爲使用它們來遷移文件的舊模式版本,這似乎是處理MongoDB中遷移的最佳途徑。

您不希望在文檔集合(ala alter table)上運行完整的數據集遷移,因爲它會給您的服務器帶來沉重的負擔,並且可能需要應用程序/服務器停機時間。有時候您可能需要編寫一個腳本,它只需抓取所有文檔即可應用新的模式/變更並調用保存,但您需要了解何時/在哪裏執行此操作。一個例子可能是,將遷移邏輯添加到doc init比運行遷移腳本花費3小時的服務器更有價值。

我發現這個link也很有幫助,基本上重申了上面的更多細節,基本上在php中實現了上述節點包的概念。

N.B.模塊是5個月大,0叉,但我環顧四周,找不到比abdelsaid的迴應風格更好/更有幫助..

+0

接受,至少有更好的東西出現。你能否將這個警告添加到你的答案中,因爲不是每個人都會看到評論。 – mahemoff

+1

補充說明,明天需要這樣做,對不起另一個問題被阻止。 – Louis

+1

已更新。可悲的是它相當破碎。讓我知道在這裏如果你找到任何東西,那麼你需要一種適合於更新的解決方案。我有一種感覺,你需要跟蹤每個版本,以加載舊的模式,並允許像模塊試圖做的修改。唉,我的貓鼬知識目前還相當缺乏。到達那裏! – Louis

32

很有趣,MongoDB的誕生是爲了迴應RDBMS中的模式問題。您無需遷移任何內容,只需要該字段即可在模式定義中設置缺省值。

new Schema({ 
    name: { type: string } 
}) 

到:

new Schema({ 
    name: { type: string }, 
    birthplace: { type: string, required: true, default: 'neverborn' } 
}); 
+1

我真的在考慮像Rails的遷移這樣的工具,它可以讓你處理變更管理方面的問題,但我不認爲真的有這樣的東西,所以我會接受這個。 – mahemoff

+0

我知道你的意思,但我沒有看到在基於文檔的數據庫中的工具,或者我錯了嗎?如果你將你的模式放在像Mercurial/Subversion/git這樣的源代碼控制下,你總是可以恢復到以前的版本。 – vimdude

+3

我不認爲它與SQL數據庫有如此不同。例如,您可能將「name」分成「firstname」和「surname」字段......您必須針對每個環境的數據庫運行該轉換並以某種方式進行跟蹤。 – mahemoff

6

我剛剛有這個問題,我需要更新我的數據庫,以反映更改我的模式。經過一番研究,我決定嘗試mongo控制檯中的updateMany()函數來進行更新,我認爲它工作得很好。

要應用此vimdude的示例中的代碼將如下所示:

try { db.<collection>.updateMany({ birthplace: null }, { $set: {"birthplace": "neverborn" } }); } catch(e) { print(e); } 

的updateMany()函數將更新基礎上的過濾器的集合中的所有文件。在這種情況下,過濾器正在查找字段「出生地」爲空的所有文檔。然後在那些名爲「出生地」的文件中設置一個新的字段,並將其值設爲「永生」。

運行的代碼,修改,以反映你的情況後運行:

db.<collection>.find().pretty() 

驗證進行了更改。具有「永生」價值的新領域「出生地」應顯示在收藏中每個文檔的末尾。

希望有所幫助。