我犯了设计方案的错误,因此我有两个集合,其中一个集合包含对另一个集合的手动引用。我现在意识到我应该创建它,以便父集合包含其他集合作为子文档。
问题是,我已经将这个方案放到一个已经创建了数百个条目的生产环境中。我想做的是以某种方式扫描所有现有数据,并将项目作为子文档复制到其引用的parent_id。
以下是我的架构示例:
收藏1 - 用户
_id
Name
收藏2 - 照片
_id
url
user_id
有没有一种快速方法可以将现有文档更改为这样的一个集合:
收藏 - 用户
_id
Name
Photos: [...]
一旦我正确设置了数据库,我就可以轻松地修改我的代码以使用新代码,但我遇到的问题是如何快速/程序性地将文档复制到其父代。
其他细节 - 我正在使用MongoHQ.com来托管我的MongoDB。
谢谢。
答案 0 :(得分:0)
我不知道您的环境的具体情况,但这种变化通常涉及以下几种步骤:
Photos
数组,请确保您的旧代码不会抱怨。User
和Photo
文档Photo
文档复制到用户documents
。这应该很容易在javaScript中创建或通过使用驱动程序的应用程序代码创建(参见下面的示例)Photos
嵌入数组如果您无法“冻结/解冻”,则需要在步骤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);
}