【发布时间】:2012-02-22 05:29:12
【问题描述】:
如何在不丢失任何数据的情况下运行迁移以更改 Mongoid/MongoDB 中的字段类型?
就我而言,我正在尝试将 BigDecimal(存储为字符串)转换为 Integer 以存储一些钱。我需要将字符串十进制表示形式转换为整数的美分。我不想丢失现有数据。
我假设这些步骤可能是这样的:
- 使用新名称创建新的整数字段,例如
amount2 - 部署到生产环境并运行迁移(或 rake 任务),将每个
amount转换为amount2的正确值 - (这段时间现有代码仍在使用
amount,从用户的角度来看没有停机时间) - 关闭站点以进行维护,再运行一次迁移以捕获任何可能在过去几分钟内发生更改的
amount字段 - 删除
amount并将amount2重命名为amount - 部署期望
amount为整数的新代码 - 备份网站
看起来 Mongoid 提供了一个rename 方法:http://mongoid.org/docs/persistence/atomic.html#rename
但我有点困惑如何使用它。如果您有一个名为amount2 的字段(并且您已经删除了amount),您是否只运行Transaction.rename :amount2, :amount?然后我想这会立即破坏底层表示,因此您必须在那之后重新启动您的应用服务器?如果你在amount 仍然存在时运行它会发生什么?它会被覆盖、失败还是尝试自行转换?
谢谢!
【问题讨论】:
-
听起来合乎逻辑。但我不确定您是否需要重新启动。一方面,您需要更新模型中的字段名称,对吧?至于覆盖,我不确定,但是这个链接whyjava.wordpress.com/2012/02/07/… 的 upsert 部分似乎确实暗示它会尝试写入,并且如果存在,可以选择覆盖该字段。所以它不像常规的基于 SQL 的重命名,而是单独移动每个文档值。有意义吗?
-
嗯...不确定,仍然希望从头到尾获得一个工作示例。如果我的成功,我会发布一个。
标签: ruby-on-rails mongodb mongoid