我试过 MongoMapper,它功能齐全(提供了几乎所有的 AR 功能) ,但我对使用大型数据集时的性能并不满意。有人比得上蒙古人吗?性能有提高吗?
你安装 mongo _ ext 了吗? 我认为性能更多地与驱动程序相关,而不是映射程序本身。当看到蒙戈原木,我可以看到没有扩展,转移似乎有一些滞后。
还可以按照 monoddb 站点上的建议,只选择您需要的字段。
sudo gem install mongo_ext是获得性能的关键。
sudo gem install mongo_ext
MongoDB 在原始速度方面击败了 CouchDB ——尽管 CDB 确实有自己的一套优势。
基准: http://www.snailinaturtleneck.com/blog/?p=74
我认为性能应该是一样的,上次我检查 MongoMapper 是否缺乏 Rails 3的支持,所以现在我关注的是 Mongoid。
上周我用 MongoMapper 做了一些测试,它很稳定,但是我发现它的查询界面有点局限(还有一些增强现实的逻辑有点古怪) ,现在转到了 Mongoid,使用起来感觉好多了——如果你习惯了增强现实的话,它会更加直观。
目前还没有关于速度的结论——但是这种转换是无痛的——它同样适用于 Rails3。
过去几周我都在用。Mongomapper 对关系型关联(非嵌入式)有更好的支持,并且有更多的第三方支持。Mongoid 有更好的查询支持,更好的文档(MM 几乎没有文档,尽管一个网站可能正在开发中) ,Rail 3支持(因此设计支持) ,以及 Google Group 上稍微活跃一些的社区。
我最后选择了蒙古人。
我认为 Mongoid 在配置和映射方面要好得多。
Devise 不支持 MongoMapper,而且我也更喜欢在 Rails3中移动,所以我改用 mongoid。
如果您正在使用 Rails3,我推荐 Mongoid ——它也使用“ include”而不是继承“ <”来持久化类——使用“ include”是 Ruby 中添加持久化的更好范例。 我觉得蒙古人和迪维斯相处得很好。
为了提高性能,尝试有选择地使用低级访问,例如,Moped-我见过它的速度提高了10倍
我同时使用了它们,它们在功能上差不多,但是看看它的代码统计
看起来 MongoMapper 的代码质量要好得多(如果它用更少的代码做同样的事情的话)。
你可以自己计算这些数据,这是分析仪 https://github.com/alexeypetrushin/code_stats
我已经使用 MongoMapper 一段时间了,但是决定迁移到 MongoId。原因是隐藏的问题加上对用户的傲慢态度。为了让 MongoMapper 能够与 Cucumber 一起工作(最终成功了) ,我不得不费尽周折,并且为了添加几个补丁,即使这个项目很简单,但这不是重点。当我试图提交一个 bug 修复(由于与 ActiveRecord 不兼容)时,他们似乎很生气,因为我发现了一个问题,于是我就被摆布了。在我进行测试的时候,我还遇到了一个主要的错误,那就是它们的查询实现,而它们的测试是按照测试通过的方式进行调优的。经过我以前的经验,不敢提交。
他们比 MongoId 有更少的请求和 bug/特性提交,也就是说社区参与度更低。和我一样的经历?
我不知道哪一个现在有更多的特性,但是我不认为 MongoMapper 有什么前途。我不介意自己修复问题和添加功能,但是我介意那些不能修复 bug 的情况。
Mongoid 正在全面支持 Rails3,并提供身份地图功能。
更多文件在 http://mongoid.org
看看这里的性能 http://mongoid.org/performance.html
我发现的一个不同之处是,MongoMapper 中的 update_attribute似乎编写整个文档,而不管实际更改了哪些属性。在 Mongoid 中,它只写已更改的属性。对于大型记录,这可能是一个重要的性能问题。对于嵌入式文档(这里是 labels)尤其如此,例如。
update_attribute
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操作符仅更新更改的标签。
save
profile
$set
另一个问题是选择要返回的字段。两者都支持 only标准,但 Mongoid 也支持一个 without标准,这个标准是 Mongo 本身支持的。
only
without
在我看来 Mongoid 的 API 更加“全面”和完整,这可能解释了它是一个更大的代码库。它似乎也有更好的记录。
差异
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
第三方图书馆
双方都声称拥有更好的第三方支持:
值得注意的是,Devise 不支持 MongoMapper。
提交活动
在过去的一年中,Mongoid 的维护和更新似乎比 MongoMapper 更加频繁。
我希望以下几点能给以上答案增加价值。
Mongoid 完全兼容 Rails 3,并且使用 ActiveModelall 在那里(验证、序列化等) ,MongoMapper 仍然专注于 Rails 2,并使用可验证 gem 进行验证。
Mongoid 正式支持 Ruby1.8.7、1.9.1和1.9.2 head。
3.Mongoid 更健壮地支持嵌入式文档,在内部层次结构的任何区域执行 MongoDB 原子操作。($set,$push,$pull 等)。对于 MM,您需要显式地告诉它执行这些操作。
MongoMapper 有更好的关系关联支持,默认情况下是这样工作的。
5.MongoMapper 更具可扩展性,它的插件架构使得人们很容易用自己的库来扩展它。蒙古人没有这个。
MM 支持身份映射,Mongoid 不支持。
MM 有一个更大的社区,可能还有更多的第三方库支持。
Mongoid 支持主/从复制集群。(写到主,循环读取到从) MM 不支持。
Mongoid 有一个非常丰富的 ARel 样式标准 API,MM 使用 AR2样式查找器。