2013-10-16 60 views
3

我最近一直在學習如何使用MongoDB中使用的是Node.js,並一直想知道我怎麼會去分享的MongoDB與團隊中的其他變化,例如,通過一個Git倉庫。MongoDB的共享與團隊改變

如果我需要,例如,一個名爲MongoDB中users收集,並收集了包含領域givenNamefamilyName一些文件,這將是很容易當上了球隊每個開發人員運行應用程序時,MongoDB的,因爲這樣做將自動創建集合和字段,因爲它們是在代碼中編寫的。

現在讓我們說,由於某種原因,我需要將這兩個字段重命名爲forenamesurname

的應用已經運行了一段時間,因此所有的球隊中開發商已經包含與givenNamefamilyName文件users收集的本地副本;生產服務器也是如此。

從我的理解我不能簡單地改變代碼中的字段名稱來使用新的字段名稱,因爲我們會'丟失'舊字段名稱中使用的任何數據(通過'丟失'I當然意味着我們不會再看到舊數據,儘管它仍然存在,如預期的那樣)。

所以我想我會在MongoDB的外殼也運行一個命令在所有相關文件的重命名字段。

但是,如果我這樣做,那麼只有我的地方了users收集的副本是最新的。

當使用MySQL時,我們可能只是在需要時運行的SQL文件中共享我們對git的所有更改,或者如果可用,則使用遷移,例如PHP中的Laravel框架。

我們會不會只是做同樣的,因爲我們與MySQL沒有和保持changes.js文件,我們在MongoDB的運行shell?

還是有更好的方式,在應用程序代碼本身要做到這一點,也許使更改當開發人員運行的應用程序自動運行?

換句話說,團隊成員之間共享MongoDB更改的最佳做法是什麼?

+0

如果您需要測試數據來反映這些變化,那麼就像是需要遷移腳本一樣。它可以用於控制檯,或者甚至是node.js,只要它一致地處理「模式」更改。或者,你可以忽略這些變化,只擔心生產。 – WiredPrairie

回答

1

數據遷移對於幾乎所有的持久性系統都是一個巨大的痛苦。有兩大策略:懶惰和渴望的遷移。

對於遷移,你需要你的代碼,以便能夠應付兩個舊的和新的數據結構。不幸的是,我不知道node.js mongodb驅動程序是如何在內部工作的。例如,在C#驅動程序中,可以註冊自定義序列化程序,定義別名或使用C#的getter和setter來啓用此行爲。所以Forename領域將從givenNameForename讀,但其存儲時回數據庫,它會永遠被序列化爲Forename

該策略的問題在於它不適用於查詢,例如, {"Forename" : "John"}會失敗,因爲某些文檔尚未遷移。索引或甚至是唯一的限制使事情變得更糟。

渴望遷移需要某種基本上貫穿數據庫中所有文檔並根據您的需要更新它們的腳本。通常,這是更簡單的路徑,它不會中斷查詢。但是,您需要在正確的時間運行此腳本,而對於大型數據集,這可能需要一段時間。在此期間,您的系統已關閉或發出不正確的結果。

因此,數據量越大,必須允許的越多'懶惰'。例如,您可能希望按用戶運行腳本(而不是按照自然順序),以便用戶非常不可能達到其數據的「半遷移」狀態。不過,你希望你的代碼能夠處理這個問題。

對於這兩個策略,當事情變得複雜,可能需要架構版本,即單個文檔有一個像_sv一個字段,還有一些知道如何從n版本得到n+1版本的腳本。然後,你可以使腳本非常抽象和冪等,所以你可以運行它們而不必擔心在新數據上運行舊腳本會破壞任何東西。