Mongoid还是MongoMapper?[关闭]


83

我已经尝试过MongoMapper,它功能完整(几乎提供了所有AR功能),但是使用大型数据集时,我对性能并不满意。有谁与Mongoid相提并论吗?任何性能提升?

Answers:


49

我使用MongoMapper已有一段时间,但决定迁移到MongoId。原因是隐藏的问题加上对用户的傲慢。为了使MongoMapper与Cucumber一起工作(最终成功),我不得不跳了个圈,即使这个项目很简单,也要放几个补丁,但这不是重点。当我尝试提交一个错误修复程序(由于与ActiveRecord不兼容)时,他们似乎对我发现问题感到气愤,并将其推倒了。在测试期间,我在查询实现方面也遇到了一个重大错误,同时以通过测试的方式对他们的测试进行了调整。根据我以前的经验,不敢提交。

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

我不知道哪一个现在具有更多功能,但是我看不到MongoMapper的未来。我不介意自己解决问题并添加功能,但我会介意无法解决错误的情况。


我可以问一下,查询实现中的主要错误是什么。我在先前的项目中使用过mongomapper,但这也是我第一次接触mongo。关于mongomapper的特定问题的任何信息都将非常有用。谢谢
红色

5
当获取first()而不进行排序时,它代替了last()(反之亦然)。但是单元测试是以指定顺序的方式编写的,因此可以通过。可能是现在修复了,但是我不再使用MongoMapper了。但是我对此表示怀疑,我看到它是如何实现的,这是一个糟糕的设计。
艾纳特(Aynat)2012年

嗨,您能否发送链接以获取有关如何从mongo mapper平稳迁移到mongoid的信息?
Chen Kinnrot 2012年

1
@Aynat我没有解决问题,但我尝试过给与我相同的结果
Viren 2012年

谢谢上帝,我看到这次对话只是决定在我的下一个大型项目中使用mongomapper或mongoid。猜猜Mongoid赢了。
aliirz 2013年

39

在过去的两个星期中,我一直在使用这两种方法。Mongomapper对关系关联(非嵌入式)有更好的支持,并具有更大的第三方支持。Mongoid具有更好的查询支持,更好的文档(尽管据说尚在建设中,但MM几乎没有,),Rail 3支持(因此还有Devise支持)以及Google网上论坛的活跃程度更高。

我最终选择了Mongoid。


27
自从我最初写这个答案以来,Mongoid已经获得了很多第三方的支持,社区之间的差异更大。在我看来,Mongoid现在是一个更明确的选择。性能应该与通过Ruby驱动程序获得的性能相对相同。尽管您在使用OM时需要小心,但不要构造可怕的文档。
纳德


37

差异性

MongoMapper

  • 声称对关系协会有更好的支持。
  • 由于是插件架构,因此声称具有更高的可扩展性。
  • 使用DSL进行查询。
  • 在MongoMapper中,多对多关联仅单侧更新。
  • 对嵌入式文档的支持较差。即使仅修改了几个属性,也将更新整个模型。

蒙古族

  • 根据传闻,建议比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

蒙古族

development:
  sessions:
    default:
      database: database_name
      hosts:
        - 127.0.0.1:27017

第三党图书馆

双方都声称有更好的第三党支持。Github揭示了以下内容:

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

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

提交活动

在过去的一年中,与MongoMapper相比,Mongoid似乎得到了更定期的维护和更新。

MongoMapper

MongoMapper

蒙古族

蒙古族


1
Mongoid当前支持身份映射。
user2503775 2013年

9

我发现的一个区别是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更加“全面”和完整,这可能解释了它是一个更大的代码库。它似乎也记录得更好。


7

您安装了mongo_ext吗?我认为性能与驱动程序的关系比映射程序本身更重要。在查看mongo日志时,我可以看到没有扩展名,但该转换器似乎有些滞后。

也按照他们在monogdb网站上的建议进行操作,仅选择所需的字段。


ruby驱动程序不是特别快,尤其是1.8,但1.9只是提升了性能!我只是想知道mongoid是否经过更优化,或者它提供的唯一方法是暂时进行查询,而mongomapper几乎功能齐全,几乎可以提供所有AR糖
PanosJee

1
请在一年后阅读这些内容的读者注意:mongo_ext不再需要,并且已被卷入基本mongo宝石中。
tkrajcar 2011年

4

上周对MongoMapper进行了一些测试,它很稳定,但是我发现查询界面有点受限制(一些AR逻辑也很古怪),今天切换到了Mongoid,使用起来感觉好多了-如果使用的话更直观到AR。

尚无速度结论-但切换过程很轻松-它也适用于Rails 3。


4

如果您使用的是Rails3,我建议您使用Mongoid-它也使用“ include”而不是继承“ <”来持久化类-使用“ include”是Ruby中添加持久性的更好范例。Mongoid在Devise中对我来说效果很好。

为了提高性能,请尝试有选择地使用较低级别的访问权限,例如Moped-我看到它的速度提高了10倍


3

我都使用了它们,它们在功能上差不多,但是看看它的代码状态 Mongoid对Mongo

看起来MongoMapper的代码质量更好(如果用更少的钱就能做到)。

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


12
关键点:“如果用更少的钱做同样的事” ...
tkrajcar 2011年

10
这似乎完全没有根据。
Jim Mitchener 2012年

14
通过代码大小比较项目的代码质量就像通过测量重量比较2辆汽车的质量。
Patrizio Rullo 2012年

3
实际上,比较汽车的重量是完全正确的-您可以做出很多判断-速度有多快,需要多少汽油等等。并且,实际上从科学的角度来看是有意义的,看看“ Kolmogorov复杂性”。
Alex Craft

1
尽管如此,尽管其中一些已经极大地提高了mongomapper的速度(coffeepowered.net/2013/07/29/…),但仍然知道并接受蒙古更快。
阿迪特·萨克森纳

3

我认为Mongoid在配置和映射方面要好得多。


1
我也这么认为。除此之外,与MongoMapper相比,它更接近NoSQL,这使您对ActiveRecord以及SQL的思考更多。另一个
优点

是的 Mongoid网站的文档令人震惊!
rodrigoalvesvieira


0

sudo gem install mongo_ext 是获得性能的关键。

尽管CDB确实有其自身的一系列优势,但MongoDB的原始速度却使CouchDB望尘莫及。

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


他说的是mongoid x mongo_mapper,什么是访问mongo而不是mongodb x benchdb的更快的ruby gem。
维克多·罗德里格斯

8
请在一年后阅读这些内容的读者注意:mongo_ext不再需要,并且已被卷入基本mongo宝石中。
tkrajcar 2011年

0

Devise不支持MongoMapper,我也更喜欢以Rails3的方式移动。所以我换了蒙古包。


我认为MM当前支持它。
2013年


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样式查找器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.