MongoDB:将引用文档的集合复制为子文档

时间:2013-02-19 21:23:49

标签: node.js mongodb mongoose mongohq

我犯了设计方案的错误,因此我有两个集合,其中一个集合包含对另一个集合的手动引用。我现在意识到我应该创建它,以便父集合包含其他集合作为子文档。

问题是,我已经将这个方案放到一个已经创建了数百个条目的生产环境中。我想做的是以某种方式扫描所有现有数据,并将项目作为子文档复制到其引用的parent_id。

以下是我的架构示例:

收藏1 - 用户

_id
Name

收藏2 - 照片

_id
url
user_id

有没有一种快速方法可以将现有文档更改为这样的一个集合:

收藏 - 用户

_id
Name
Photos: [...]

一旦我正确设置了数据库,我就可以轻松地修改我的代码以使用新代码,但我遇到的问题是如何快速/程序性地将文档复制到其父代。

其他细节 - 我正在使用MongoHQ.com来托管我的MongoDB。

谢谢。

1 个答案:

答案 0 :(得分:0)

我不知道您的环境的具体情况,但这种变化通常涉及以下几种步骤:

  1. 如果User对象中有Photos数组,请确保您的旧代码不会抱怨。
  2. “冻结”应用程序,以便不会创建新的UserPhoto文档
  3. 运行迁移脚本,将Photo文档复制到用户documents。这应该很容易在javaScript中创建或通过使用驱动程序的应用程序代码创建(参见下面的示例)
  4. 部署期望Photos嵌入数组
  5. 的新版应用程序
  6. “解冻”应用程序以开始创建新文档
  7. 如果您无法“冻结/解冻”,则需要在步骤4之后运行delta脚本,以便在部署新应用程序后迁移新创建的Photo文档。

    脚本看起来像这样(未经测试):

    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);
    }