我已经尝试过MongoMapper,它功能齐全(提供几乎所有的AR功能),但我对使用大型数据集时的性能不太满意。有没有人比较Mongoid?任何性能提升?
答案 0 :(得分:48)
我已经使用了MongoMapper一段时间但决定迁移到MongoId。原因是隐藏的问题加上对用户的傲慢。我不得不跳过篮球让MongoMapper与Cucumber一起工作(最终成功),并且即使项目很简单也要提供几个补丁,但这不是重点。当我尝试提交错误修复程序时(由于与ActiveRecord不兼容),他们似乎很生气,我发现了一个问题而且我被推了出来。在我测试时,我也遇到了他们的查询实现的一个主要错误,而他们的测试是以测试通过的方式调整的。在我以前的经历之后,不敢提交它。
与MongoId相比,他们的拉取请求和错误/功能提交数量明显较少,即社区参与度要低得多。和我一样的经历?
我不知道哪一个目前有更多功能,但我在MongoMapper中看不到太多未来。我不介意自己修复问题和添加功能,但我确实介意他们不修复错误的情况。
答案 1 :(得分:39)
过去几周我一直在使用这两种方法。 Mongomapper对关系关联(非嵌入式)有更好的支持,并且有更多的第三方支持。 Mongoid有更好的查询支持,更好的文档(MM几乎没有,虽然网站可能正在开发中),Rail 3支持(以及Devise支持)和Google Groups上稍微活跃的社区。 p>
我最终选择了Mongoid。
答案 2 :(得分:37)
<强>差异强>
MongoMapper
Mongoid
<强>相似性强>
<强>配置强>
MongoMapper
defaults: &defaults
host: 127.0.0.1
port: 27017
development:
database: database_name
Mongoid
development:
sessions:
default:
database: database_name
hosts:
- 127.0.0.1:27017
第三方图书馆
双方都声称拥有更好的第三方支持。 Github揭示了以下内容:
值得注意的是,Devise不支持MongoMapper。
提交活动
在过去一年中,看起来Mongoid比MongoMapper更经常地维护和更新。
<强> MongoMapper 强>
<强> Mongoid 强>
答案 3 :(得分:9)
我发现的一个区别是MongoMapper中的update_attribute
似乎写了整个文档,无论实际更改了什么属性。在Mongoid中,它只写入已更改的属性。对于大型记录,这可能是一个重要的性能问题。嵌入式文档(此处为labels
)尤其如此,例如
profile = Profile.find(params[:id])
label = profile.labels.find_or_create_by(idx: params[:idx])
# MongoMapper doesn't have find_or_create_by for embedded docs
# -- you'll have to write custom code
profile.save
在save
上,MongoMapper将保存整个profile
记录,但MongoId将使用具有位置逻辑的$set
运算符来仅更新已更改的标签。
另一个问题是选择要返回的字段。两者都支持only
标准,但Mongoid也支持without
标准,Mongo原生支持该标准。
在我看来,Mongoid在其API中更加“圆润”并且完整,这可能解释了它是一个更大的代码库。它似乎也有更好的记录。
答案 4 :(得分:7)
你安装了mongo_ext吗? 我认为性能与驱动程序的关系比映射器本身更多。在查看mongo日志时,我可以看到没有扩展名,转换器似乎有一些滞后。
同样按照他们在monogdb网站上的建议,只选择您需要的字段。
答案 5 :(得分:4)
上周对MongoMapper进行了一些测试,它是稳定的,但我发现查询界面有点受限(也有一些AR逻辑很古怪),今天切换到Mongoid并且使用感觉好多了 - 如果更直观的话你习惯了AR。
还没有速度结论 - 但转换是无痛的 - 它也适用于Rails 3。
答案 6 :(得分:4)
如果您正在使用Rails3,我建议使用Mongoid - 它也使用“include”而不是继承“&lt;”持久化类 - 使用“include”是Ruby中添加持久性的更好范例。 使用Devise,Mongoid对我来说很好。
要提高性能,请尝试有选择地使用较低级别的访问权限,例如:轻便摩托车 - 我已经看到这速度提高了10倍
答案 7 :(得分:3)
我认为Mongoid在配置和映射方面要好得多。
答案 8 :(得分:3)
我使用了它们,它们即将在功能上相等,但请查看它的代码统计信息
看起来MongoMapper具有更好的代码质量(如果它以相同的方式做得更少)。
您可以自己计算此统计数据,这是分析器https://github.com/alexeypetrushin/code_stats
答案 9 :(得分:0)
sudo gem install mongo_ext
是获得表现的关键。
MongoDB在原始速度方面吹走了CouchDB - 尽管CDB确实有其自身的优势。
答案 10 :(得分:0)
我希望性能相同,上次我检查MongoMapper缺少Rails 3支持 - 所以我现在正在关注Mongoid。
答案 11 :(得分:0)
Devise不支持MongoMapper,我也更喜欢使用Rails3方式。所以我换成了mongoid。
答案 12 :(得分:0)
答案 13 :(得分:0)
我希望以下几点为上述答案添加值。
1.Mongoid完全与Rails 3兼容,并且全部使用ActiveModel 在地方(验证,序列化等),其中MongoMapper仍然专注于Rails 2并使用可验证的gem进行验证。
2.Mongoid正式支持并使用Ruby 1.8.7,1.9.1和1.9.2头。
3.Mongoid更强大地支持嵌入式文档,在内部的层次结构的任何区域执行MongoDB原子操作。 ($ set,$ push,$ pull等)。使用MM,您需要明确告诉它执行这些操作。
4.MongoMapper具有更好的关系关联支持,默认情况下这样工作。
5.MongoMapper更具可扩展性,其插件架构使人们可以很容易地使用自己的库扩展它。 Mongoid没有这个。
6.MM支持身份地图,Mongoid不支持。
7.MM拥有更大的社区,可能还有更多的第三方图书馆支持。我对文档和rdoc感到疯狂。
8.Mongoid支持主/从复制群集。 (写入主人,循环读取到奴隶)MM没有。
9.Mongoid有一个非常丰富的ARel风格标准API,MM使用AR2风格的查找器。