我构建了一个使用MongoDB作为后端和MongoMapper作为ORM工具的Rails应用程序。假设在版本1中,我定义了以下型号:MongoMapper和迁移
class SomeModel
include MongoMapper::Document
key :some_key, String
end
在版本2的后面,我意识到我需要一个新的模型所需的密钥。因此,在第2版,SomeModel现在看起来是这样的:
class SomeModel
include MongoMapper::Document
key :some_key, String
key :some_new_key, String, :required => true
end
我如何迁移我的所有现有数据,包括some_new_key?假设我知道如何为所有现有文档设置合理的默认值。进一步说,假设在版本3中,我意识到我真的不需要some_key。所以,现在的模型看起来像这样
class SomeModel
include MongoMapper::Document
key :some_new_key, String, :required => true
end
但这一切在我的数据库中的现有记录有some_key设置的值,它只是在这一点上浪费空间。我如何回收这个空间?
使用ActiveRecord,我可以创建迁移以添加some_new_key(在版本1 - >版本2迁移中)的初始值,并删除some_key(在版本2 - >版本3迁移中)的值。
用MongoDB/MongoMapper做这件事的适当方法是什么?在我看来,跟踪哪些迁移已经运行的一些方法仍然是必要的。这样的事情存在吗?
编辑:我认为人们错过了我的问题。有时您希望能够在数据库上运行脚本来更改或重构其中的数据。上面给出了两个示例,一个是添加了新的必需密钥,另一个是可以移除密钥并可以回收空间的示例。你如何管理这些脚本的运行? ActiveRecord迁移为您提供了一种简单的方法来运行这些脚本,并确定哪些脚本已经运行,哪些脚本尚未运行。我显然可以编写一个Mongo脚本来对数据库进行任何更新,但是我期待的是一个像迁移这样的框架,可以让我跟踪哪些升级脚本已经运行。
我认为Mongo(/ Mapper)可能对于这种事情太年轻了。 :/ – Konklone 2010-01-05 20:04:23
由于Mongo DB实际上没有任何模式,所以在模式方面的迁移实际上并不是一个适当的概念。您需要自己编写数据迁移脚本。 – zsong 2012-01-26 21:39:44