2013-02-19 207 views
0

我犯了一個設計方案的錯誤,因此我有兩個集合,其中一個文檔包含對另一個文檔的手動引用。我現在意識到我應該創建它,以便父代集合將其他集合包含爲子文檔。MongoDB:將引用文檔的集合作爲子文檔複製

問題是,我已經把這個方案放到了一個已經創建了數百個條目的生產環境中。我想要做的是以某種方式掃描所有現有數據,並將這些項目作爲子文檔複製到其引用的parent_id中。

這裏是我的架構的一個例子:

系列1 - 用戶

_id 
Name 

系列2 - 照片

_id 
url 
user_id 

是否有一個快速的方法來改變現有文檔是這樣一個集合:

系列 - 用戶

_id 
Name 
Photos: [...] 

一旦我有正確的數據庫設置,我可以很容易地修改我的代碼,以使用新的,但我遇到的問題是搞清楚如何快速/程序將文件複製到他們的父母。

其他詳細信息 - 我正在使用MongoHQ.com託管我的MongoDB。

謝謝。

+1

你需要採取任何架構遷移這樣照顧自己,在代碼中。只需更新您的'User'模式,然後迭代您的集合以更新您的集合以反映新的模式。 – JohnnyHK 2013-02-19 21:36:10

回答

0

我不知道你的環境的細節,但這種變化通常涉及以下幾種措施:

  1. 確保如果有Photos陣列中的舊代碼不抱怨用戶對象。
  2. 「凍結」的應用程序,以便不創建新UserPhoto文件
  3. 運行遷移腳本,複製Photo文件到用戶documents。這應該是很容易創建使用的驅動程序無論是在Javascript或通過應用代碼(見下例)
  4. 部署一個期望Photos要被嵌入陣列
  5. 在應用程序的新版本「解凍」的應用程序以開始創建新文檔

如果你不能「凍結/解凍」,您將需要將新的應用程序部署後再移植新創建的文件Photo第4步後運行一個增量腳本。

該腳本將看起來像這樣(未經):

db.User.find().forEach(function (u) { 
    u.Photos = new Array(); 
    db.Photo.find({user_id : u._id}).forEach(function (p) { 
     u.Photos.push(p); 
    } 
    db.User.Save(u); 
} 
+0

謝謝,那正是我一直在尋找的。不知何故,我認爲它會更復雜,但它肯定有助於解釋。 – 2013-02-20 00:06:44

相關問題