管理mongoid迁移

Pau*_*gar 25 ruby-on-rails database-migration rails-migrations mongoid

有人能给我一个简短的介绍,使用Mongoid在Rails中进行数据库迁移吗?我对每个文档迁移的懒惰特别感兴趣.这意味着,无论何时从数据库中读取文档,都要将其迁移到最新版本并再次保存.

有没有人以前做过这种事情?我遇到过mongoid_rails_migrations,但它没有提供任何类型的文档,虽然它看起来像这样做,但我真的不确定如何使用它.

我应该指出,我只是在概念上熟悉ActiveRecord迁移.

Zac*_*ker 22

如果您想立即进行整个迁移,那么mongoid_rails_migrations将满足您的需求.文档并不多,它复制了标准ActiveRecord迁移的功能.您编写了迁移,然后使用rake db:migrate它们来应用它们,并处理确定哪些已经运行但尚未运行.如果您想了解具体内容,我可以回答其他问题.

对于延迟迁移,最简单的解决方案是使用after_initialize回调.检查字段是否与旧数据方案匹配,如果是,则将对象进行修改并更新,例如:

class Person
    include Mongoid::Document

    after_initialize :migrate_data

    field :name, :type => String

    def migrate_data
        if !self[:first_name].blank? or !self[:last_name].blank?
            self.set(:name, "#{self[:first_name]} #{self[:last_name]}".strip)
            self.remove_attribute(:first_name)
            self.remove_attribute(:last_name)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

在上面给出的具体方法中要记住的权衡:

如果你运行一个返回大量记录的请求,例如Person.all.each {|p| puts p.name}100个人拥有旧格式,它将立即运行100个设置查询.您也可以打电话self.name = "#{self.first_name} #{self.last_name}".strip,但这意味着只有保存记录才会迁移您的数据.

您可能遇到的一般问题是,Person.where(:name => /Foo/).count在迁移所有数据之前,任何大量查询都会失败.此外,如果您执行Person.only(:name).first迁移将失败,因为您忘记包含first_namelast_name字段.


Pri*_*ain 7

Zachary Anker在他的回答中解释了很多.使用mongoid_rails_migrations是迁移的一个很好的选择.

以下是一些示例链接,对您来说有用,可以使用mongoid_rails_migrations

使用Mongo驱动程序的Mongoid迁移

嵌入Mongoid文档和数据迁移

除此之外,本例中的自述文件应该足以实现mongoid迁移