【问题标题】:MongoDB: Copy a collection of referenced documents as subdocumentsMongoDB:将引用文档的集合复制为子文档
【发布时间】:2013-02-19 21:23:49
【问题描述】:

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

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

这是我的架构示例:

集合 1 - 用户

_id
Name

收藏 2 - 照片

_id
url
user_id

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

收藏 - 用户

_id
Name
Photos: [...]

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

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

谢谢。

【问题讨论】:

  • 您需要自己在代码中处理任何这样的架构迁移。只需更新您的 User 架构,然后遍历您的集合以更新您的集合以反映新架构。

标签: node.js mongodb mongoose mongohq


【解决方案1】:

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

  1. 如果 User 对象中有 Photos 数组,请确保您的旧代码不会报错。
  2. “冻结”应用程序,以便不创建新的 UserPhoto 文档
  3. 运行将Photo 文档复制到用户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);
}

【讨论】:

  • 谢谢,这正是我想要的。不知何故,我认为这会更复杂,但解释一下肯定会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2020-12-05
  • 2012-07-17
  • 2016-10-21
  • 2013-07-12
  • 1970-01-01
  • 2014-03-19
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多