Mongoid或MongoMapper?

时间:2009-12-24 13:43:09

标签: ruby mongodb mongoid mongomapper odm

我已经尝试过MongoMapper,它功能齐全(提供几乎所有的AR功能),但我对使用大型数据集时的性能不太满意。有没有人比较Mongoid?任何性能提升?

14 个答案:

答案 0 :(得分:48)

我已经使用了MongoMapper一段时间但决定迁移到MongoId。原因是隐藏的问题加上对用户的傲慢。我不得不跳过篮球让MongoMapper与Cucumber一起工作(最终成功),并且即使项目很简单也要提供几个补丁,但这不是重点。当我尝试提交错误修复程序时(由于与ActiveRecord不兼容),他们似乎很生气,我发现了一个问题而且我被推了出来。在我测试时,我也遇到了他们的查询实现的一个主要错误,而他们的测试是以测试通过的方式调整的。在我以前的经历之后,不敢提交它。

与MongoId相比,他们的拉取请求和错误/功能提交数量明显较少,即社区参与度要低得多。和我一样的经历?

我不知道哪一个目前有更多功能,但我在MongoMapper中看不到太多未来。我不介意自己修复问题和添加功能,但我确实介意他们不修复错误的情况。

答案 1 :(得分:39)

过去几周我一直在使用这两种方法。 Mongomapper对关系关联(非嵌入式)有更好的支持,并且有更多的第三方支持。 Mongoid有更好的查询支持,更好的文档(MM几乎没有,虽然网站可能正在开发中),Rail 3支持(以及Devise支持)和Google Groups上稍微活跃的社区。

我最终选择了Mongoid。

答案 2 :(得分:37)

<强>差异

MongoMapper

  • 声称可以更好地支持关系协会。
  • 由于它的插件架构而被声称更具可扩展性。
  • 使用DSL进行查询。
  • 在MongoMapper中,多对多关联仅在单方面更新。
  • 对嵌入式文档的支持不太强大。即使只修改了少数属性,也会更新整个模型。

Mongoid

  • 建议通过轶事证据比MongoMapper更快。
  • 对嵌入式文档提供更强大的支持,使用MongoDB原子操作($ set,$ push,$ pull等)来就地更新嵌套文档。
  • 支持双向多对多关联。
  • 使用可链接的类似ARel的语法进行查询。

<强>相似性

  • MongoMapperMongoid都有包含良好文档的网站。 MongoMapper长期以来声称文档不好,但他们的新网站似乎缩小了差距。
  • 两者都可以通过YAML文件进行配置,并且两者都有一个用于该文件的rails生成器。
  • 两者都完全兼容Rails 3.

<强>配置

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揭示了以下内容:

  • 搜索“Mongoid”会产生12671个结果。
  • 搜索“MongoMapper”会产生4708个结果。

值得注意的是,Devise不支持MongoMapper。

提交活动

在过去一年中,看起来Mongoid比MongoMapper更经常地维护和更新。

<强> MongoMapper

MongoMapper

<强> Mongoid

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)

我使用了它们,它们即将在功能上相等,但请查看它的代码统计信息 Mongoid vs MongoMapper

看起来MongoMapper具有更好的代码质量(如果它以相同的方式做得更少)。

您可以自己计算此统计数据,这是分析器https://github.com/alexeypetrushin/code_stats

答案 9 :(得分:0)

sudo gem install mongo_ext是获得表现的关键。

MongoDB在原始速度方面吹走了CouchDB - 尽管CD​​B确实有其自身的优势。

基准:http://www.snailinaturtleneck.com/blog/?p=74

答案 10 :(得分:0)

我希望性能相同,上次我检查MongoMapper缺少Rails 3支持 - 所以我现在正在关注Mongoid。

答案 11 :(得分:0)

Devise不支持MongoMapper,我也更喜欢使用Rails3方式。所以我换成了mongoid。

答案 12 :(得分:0)

Mongoid正在全力支持Rails3并具有身份地图功能。

更多文档位于http://mongoid.org

在此处查看效果http://mongoid.org/performance.html

答案 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风格的查找器。