管理mongoid迁移

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

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

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

如果您想一次完成整个迁移,那么mongoid_rails_migrations将满足您的需求。 文档并不多,它复制了标准ActiveRecord迁移的function。 您编写了迁移,然后使用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 

我在上面给出的具体方法时要记住这些权衡:

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

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

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

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

Mongo迁移使用Mongo驱动程序

嵌入Mongoid文档和数据迁移

除此之外, 自述文件应该足以用这个例子来实现mongoid迁移

我有同样的需要。

以下是我提出的建议: https : //github.com/nviennot/mongoid_lazy_migration

我很乐意感谢一些反馈

Interesting Posts