我已经尝试过MongoMapper,它功能完整(几乎提供了所有AR功能),但是使用大型数据集时,我对性能并不满意。有谁与Mongoid相提并论吗?任何性能提升?
Answers:
我使用MongoMapper已有一段时间,但决定迁移到MongoId。原因是隐藏的问题加上对用户的傲慢。为了使MongoMapper与Cucumber一起工作(最终成功),我不得不跳了个圈,即使这个项目很简单,也要放几个补丁,但这不是重点。当我尝试提交一个错误修复程序(由于与ActiveRecord不兼容)时,他们似乎对我发现问题感到气愤,并将其推倒了。在测试期间,我在查询实现方面也遇到了一个重大错误,同时以通过测试的方式对他们的测试进行了调整。根据我以前的经验,不敢提交。
与MongoId相比,它们的拉取请求和错误/功能提交的数量要少得多,即社区参与度要低得多。和我一样的经历?
我不知道哪一个现在具有更多功能,但是我看不到MongoMapper的未来。我不介意自己解决问题并添加功能,但我会介意无法解决错误的情况。
在过去的两个星期中,我一直在使用这两种方法。Mongomapper对关系关联(非嵌入式)有更好的支持,并具有更大的第三方支持。Mongoid具有更好的查询支持,更好的文档(尽管据说尚在建设中,但MM几乎没有,),Rail 3支持(因此还有Devise支持)以及Google网上论坛的活跃程度更高。
我最终选择了Mongoid。
差异性
MongoMapper
蒙古族
相似之处
组态
MongoMapper
defaults: &defaults
host: 127.0.0.1
port: 27017
development:
database: database_name
蒙古族
development:
sessions:
default:
database: database_name
hosts:
- 127.0.0.1:27017
第三党图书馆
双方都声称有更好的第三党支持。Github揭示了以下内容:
值得注意的是,Devise不支持MongoMapper。
提交活动
在过去的一年中,与MongoMapper相比,Mongoid似乎得到了更定期的维护和更新。
MongoMapper
蒙古族
我发现的一个区别是update_attribute
,无论实际更改了哪些属性,MongoMapper似乎都可以编写整个文档。在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更加“全面”和完整,这可能解释了它是一个更大的代码库。它似乎也记录得更好。
您安装了mongo_ext吗?我认为性能与驱动程序的关系比映射程序本身更重要。在查看mongo日志时,我可以看到没有扩展名,但该转换器似乎有些滞后。
也按照他们在monogdb网站上的建议进行操作,仅选择所需的字段。
mongo_ext
不再需要,并且已被卷入基本mongo
宝石中。
我都使用了它们,它们在功能上差不多,但是看看它的代码状态
看起来MongoMapper的代码质量更好(如果用更少的钱就能做到)。
您可以自己计算此统计信息,这是分析器https://github.com/alexeypetrushin/code_stats
我认为Mongoid在配置和映射方面要好得多。
我希望性能是相同的,上次我检查MongoMapper缺少Rails 3支持-所以我现在正在研究Mongoid。
我希望以下几点能为上述答案增加价值。
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样式查找器。