我正在构建一个使用 MongoDB 作为后端和 MongoMapper 作为 ORM 工具的 Rails 应用程序。假设在版本 1 中,我定义了以下模型:
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 的初始值(在 version1 -> version2 迁移中)并删除 some_key 的值(在 version2 -> version3 迁移中)。
使用 MongoDB/MongoMapper 执行此操作的适当方法是什么?在我看来,一些跟踪已运行迁移的方法仍然是必要的。这样的事情存在吗?
编辑:我认为人们错过了我的问题的重点。有时您希望能够在数据库上运行脚本来更改或重组其中的数据。我在上面给出了两个示例,一个是添加了新的必需密钥,一个是可以删除密钥并可以回收空间的示例。您如何管理运行这些脚本?ActiveRecord 迁移为您提供了一种简单的方法来运行这些脚本并确定哪些脚本已经运行以及哪些脚本尚未运行。我显然可以编写一个对数据库进行任何更新的 Mongo 脚本,但我正在寻找的是一个像迁移这样的框架,它可以让我跟踪哪些升级脚本已经运行。