我正在构建一个使用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脚本,在数据库上执行任何更新,但我正在寻找的是一个类似迁移的框架,它可以让我跟踪哪些升级脚本已经运行。
发布于 2010-03-15 14:05:38
看看Mongrations...我刚读完,它看起来像是你想要的。
http://terrbear.org/?p=249
http://github.com/terrbear/mongrations
干杯!Kapslok
发布于 2009-11-21 03:26:10
一种选择是使用update操作一次更新所有数据。多更新是开发版本中的新功能,因此您需要使用其中的一个。
发布于 2010-05-13 23:19:55
你可以试试我刚刚做的这个小玩意儿,但目前它只适用于mongoid和rails 3 (beta 3)。http://github.com/adacosta/mongoid_rails_migrations。当它进入最终版本时,它将被升级到rails 3。
https://stackoverflow.com/questions/1767143
复制相似问题