也就是把所有 embeds_many 和 embeds_one 的关系都改成 has_many 和 has_one,同时将 embedded_in 都调换成 belongs_to,同时我们须要将工程中对应的测试都改成这种引用的关系,然而只改变代码中的关系并没有真正改变 MongoDB 中的数据。
若何大年夜 MongoDB 迁徙到 MySQL 其实是一个工程问题,我们须要在全部过程中赓续寻找可能掉足的问题,将一个比较复杂的义务进行拆分,在真正做迁徙之前尽可能地削减迁徙对办事可用性以及稳定性带来的影响。
- def embeds_many_to_has_many(parent, child)
- child_key_name = child.to_s.underscore.pluralize
- parent.collection.find({}).each do |parent_document|
- next unless parent_document[child_key_name]
- parent_document[child_key_name].each do |child_document|
- new_child = child_document.merge “#{parent.to_s.underscore}_id”: parent_document[‘_id’]
- child.collection.insert_one new_child
- end
- end
- parent.all.unset(child_key_name.to_sym)
- end
- embeds_many_to_has_many(Person, Address)
我们可以应用上述的代码将关系为嵌入的模型都转换成引用,拍平所有复杂的数据关系,这段代码的运行时光与嵌入关系中的两个模型的数量有关,须要留意的是,MongoDB 中嵌入模型的数据可能因为某些原因出现雷同的 _id 在插入时会产生冲突导致崩溃,你可以对 insert_one 应用 resuce 来包管这段代码的运行不会因为上述原因而停止。
经由过程这段代码我们就可以轻松将原有的嵌入关系全部展开变成引用的关系,将嵌入的关系变成引用除了做这两个改变之外,不须要做其他的工作,无论是数据的萌芽照样模型的创定都不须要改变代码的实现,不过记得为子模型中父模型的外键添加索引,不然会导致父模型在获取本身持有的全部子模型时造成全表扫描:
- class Comment
- include Mongoid::Document
- index post_id: 1
- belongs_to :post
- end
在处理了 MongoDB 中独有的嵌入式关系之后,我们就须要解决一些复杂的集合类型了,比如数组和哈希,如不雅我们应用 MySQL5.7 或者 PostgreSQL 的话,其实并不须要对他们进行处理,因为最新版本的 MySQL 和 PostgreSQL 已经供给了对 JSON 的支撑,不过作者照样将项目中的数组和哈希都变成了常见的数据构造。
在这个可选的过程中,其实并没有什么标准谜底,我们可以根据须要将不合的数据转换成不合的数据构造:
比如,将数组变成字符串或者一对多关系,将哈希变成当前文档的键值对等等,若何处理这些集合数据其实都要看我们的营业逻辑,在改变┞封些字段的同时尽量为上层供给一个与本来直接 .tags 或者 .categories 结不雅雷同的 API:
- class Post
- …
- def tag_titles
- tags.map(&:title)
- end
- def split_categories
- categories.split(‘,’)
- end
推荐阅读
总之,HDD硬盘和SSD硬盘各有本身的市场。而兼具SSD硬盘和HDD硬盘的机能和特点的mSATASSD设备和混淆驱动器是花费者寻求分砂茨?的更浩揭捉?择。 沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的>>>详细阅读
本文标题:如何从MongoDB迁移到MySQL?这有现成经验!
地址:http://www.17bianji.com/lsqh/38066.html
1/2 1