0

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

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

这是我的架构示例:

集合 1 - 用户

_id
Name

收藏 2 - 照片

_id
url
user_id

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

集合 - 用户

_id
Name
Photos: [...]

正确设置数据库后,我可以轻松修改代码以使用新代码,但我遇到的问题是弄清楚如何快速/按程序将文档复制到其父级。

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

谢谢你。

4

1 回答 1

0

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

  1. Photos如果User 对象中有一个数组,请确保您的旧代码不会报错。
  2. “冻结”应用程序,以便不创建新文件User和文档Photo
  3. Photo运行将文档复制到 User的迁移脚本documents。这应该很容易在 javaScript 或使用驱动程序的应用程序代码中创建(参见下面的示例)
  4. 部署期望Photos嵌入到阵列中的应用程序的新版本
  5. “解冻”应用程序以开始创建新文档

如果您无法“冻结/解冻”,则需要在第 4 步之后运行一个增量脚本,该脚本将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);
}
于 2013-02-19T22:20:59.397 回答