【发布时间】:2010-12-18 12:53:57
【问题描述】:
我正在构建一个 Rails 应用程序,使用 MongoDB 作为后端,使用 MongoMapper 作为 ORM 工具。假设在版本 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 脚本,但我正在寻找的是一个像迁移这样的框架,它可以让我跟踪哪些升级脚本已经运行。
【问题讨论】:
-
我认为 Mongo(/Mapper) 对于这种事情来说可能太年轻了。 ://
-
在模式方面的迁移实际上在 Mongo DB 中不是一个正确的概念,因为 Mongo DB 实际上没有任何模式。您只需要自己编写数据迁移脚本即可。
标签: ruby-on-rails mongodb migration mongomapper