2013-02-19 94 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

相关问题