似乎Mongoid现在是基于性能和开发活动的Mongo的优秀ORM。不幸的是,我们使用MongoMapper并需要迁移。
我们应该注意哪些问题或绊脚石?我们在Google上发现了一些过时的文章,并尝试在Mongoid Google网上论坛上发帖(虽然我们被禁止),但是会喜欢过去做过这种情况的SO成员的想法。
我们正在使用Rails 3.2.12。
谢谢!
答案 0 :(得分:18)
它们都是伟大的Ruby MongoDB库。但是如果你想切换,这里有一些注意事项:
将MongoMapper ORM迁移到Mongoid ORM - Notes
配置数据库连接。
替换配置yaml文件(包括副本配置)。
配置Mongoid特定选项。例如 - raise_not_found_error: false
。如果你不想在每次查询都没有返回错误时发生错误......
将所有模型定义更改为include MongoMapper::Document
至include Mongoid::Document
更改所有字段定义的格式。
在mongoid中,你应该指定时间戳:include Mongoid::Timestamps
更改验证。例如::in => ARRAY
,将是:validates :name, presence: true, inclusion: { in: ARRAY }
更改索引。
按格式更改order_by。例如:MM:Model.all(:order => 'name')
。 Mongoid:Model.order_by('name ASC')
Error
是Mongoid中的关键字。因此,如果您有一个名为Error
的模型,则应更改它。
分页格式不同,使用另一个宝石。
MM中的主键索引条目为id
。在Mongoid中它是_id
,如果您在对象JSON中依赖.id
的其他代码,则可以在模型中覆盖as_json函数以创建所需的JSON结构。
在MM Model.fields(:id, :name)
中,将从数据库返回的字段限制为提供给方法的字段。在Mongoid中,它是Model.only(:name,:id)
有些查询发生了变化:
按数组选择对象:MM:Model.where(:attr.in => [ ] )
和Model.where(:attr => [ ] )
。 Mongoid仅限于:Model.where(:attr.in => [ ] )
MM的地图选项相当于Mid的选择。 Model.map(&:name)
- 到 - Model.pluck(:name)
Mongoid不支持查找nil的查询。例如:value = nil. Model.find(value)
会抛出错误:"Calling Document .find with nil is invalid"
。所以在mongoid中我们应该做:Model.find(value || "")
。
在MM中:Model.find_or_initialize_by_name("BOB")
。在Mongoid Model.find_or_initialize_by(name: "BOB")
。
MM可用于以下两个选项:Model.where({:name => 'BOB'}).first
和Model.first({:name => 'BOB'})
。 Mongoid只有第一个选择。
在MM中,要更新多个对象:Model.set({conditions},attr_to_update)
。在Mongoid:Model.where(conditions).update_all(attr_to_update)
。