Mongoid 还是 MongoMapper? [关闭]

Posted

技术标签:

【中文标题】Mongoid 还是 MongoMapper? [关闭]【英文标题】:Mongoid or MongoMapper? [closed] 【发布时间】:2010-12-29 19:47:49 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我也这么认为。除此之外,它比 MongoMapper 更接近 NoSQL,它让你更多地考虑 ActiveRecord 和 SQL。另一个优点是很棒的文档 是的! Mongoid 网站与文档一起震撼!【参考方案2】:

我希望以下几点为上述答案增添价值。

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 拥有更大的社区,并且可能有更多的 3rd 方库支持。我对文档和 rdoc 着迷。

8.Mongoid 支持主/从复制集群。 (写入主机,循环读取从机)MM 没有。

9.Mongoid有极其丰富的ARel风格标准API,MM使用AR2风格查找器。

【讨论】:

【参考方案3】:

区别

MongoMapper

声称对关系关联有更好的支持。 声称因为它的插件架构而更具可扩展性。 使用 DSL 进行查询。 多对多关联在 MongoMapper 中仅更新一侧。 对嵌入式文档的支持较弱。即使只修改了几个属性,也会更新整个模型。

Mongoid

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

相似之处

MongoMapper 和Mongoid 都有具有良好文档的网站。长期以来,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

第三方库

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

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

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

提交活动

在过去的一年里,看起来 Mongoid 比 MongoMapper 得到了更频繁的维护和更新。

MongoMapper

Mongoid

【讨论】:

Mongoid 目前支持身份映射。【参考方案4】:

如果您使用的是 Rails3,我会推荐 Mongoid——它还使用“include”而不是继承“

要提高性能,请尝试有选择地使用较低级别的访问权限,例如助力车 - 我发现它的速度提高了 10 倍

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

我不知道现在哪个功能更多,但我看不到 MongoMapper 的未来。我不介意自己解决问题和添加功能,但我确实介意他们无法修复错误的情况。

【讨论】:

我能问你,查询实现中的主要错误是什么。我在之前的项目中使用过 mongomapper,但这也是我第一次接触 mongo。任何有关 mongomapper 特定问题的信息都会很棒。谢谢 当 first() 没有排序时,它作为 last() 工作(反之亦然)。但是单元测试是按照它指定顺序的方式编写的,所以它通过了。可能现在已经修复了,但我不再使用 MongoMapper。但我对此表示怀疑,我看到了它是如何实现的,这是一个糟糕的设计。 您好,您能否发送有关如何从 mongo mapper 顺利迁移到 mongoid 的信息的链接? @Aynat 我没有修复它但我试过它给了我相同的结果 感谢上帝,我看到这个对话只是决定在我的下一个大项目中使用 mongomapper 或 mongoid。猜猜 Mongoid 赢了。【参考方案7】:

Mongoid 完全支持 Rails3 并具有身份映射功能。

更多文档在http://mongoid.org

在这里查看表演http://mongoid.org/performance.html

【讨论】:

【参考方案8】:

我使用了它们,它们的功能差不多,但是看看它的代码统计

看起来 MongoMapper 的代码质量要好得多(如果它用更少的代码做同样的事情的话)。

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

【讨论】:

关键点:'if it does the same with less'... 这似乎完全没有根据。 通过代码大小来比较一个项目的代码质量,就像通过测量重量来比较两辆汽车的质量。 实际上比较汽车的重量是完全正确的——你可以做出很多判断——它有多快,需要多少汽油等等。而且,实际上从科学的角度来看这是有道理的,看看“Kolmogorov 复杂性”。 尽管如此,尽管有些大大提高了 mongomapper 的速度 (coffeepowered.net/2013/07/29/…),但人们仍然知道并接受 mongoid 更快。【参考方案9】:

Devise 不支持 MongoMapper,我也更喜欢以 Rails3 方式移动。所以我切换到了mongoid。

【讨论】:

我觉得MM目前支持。【参考方案10】:

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

MongoDB 在原始速度方面击败了 CouchDB——尽管 CDB 确实有自己的优势。

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

【讨论】:

他说的是mongoid x mongo_mapper,什么是访问mongo更快的ruby gem,而不是mongodb x couchdb。 一年后阅读这篇文章的人请注意:mongo_ext 不再需要,并且已被纳入基本的mongo gem。【参考方案11】:

在过去的几周里,我一直在使用这两种方法。 Mongoapper 对关系关联(非嵌入式)有更好的支持,第三方支持也更大。 Mongoid 有更好的查询支持、更好的文档(MM 几乎没有,虽然一个网站据说正在开发中)、Rail 3 支持(因此也支持 Devise)以及在 Google Groups 上稍微活跃的社区。​​p>

我最终选择了 Mongoid。

【讨论】:

自从我最初写这个答案以来,Mongoid 已经获得了很多第三方的支持,社区的差异更大。在我看来,今天 Mongoid 是一个更明确的选择。性能应该相对相同,因为它们都通过 Ruby 驱动程序。虽然你需要小心 OM,不要构建可怕的文档。 MongoMapper 的多对多被破坏:github.com/jnunemaker/mongomapper/pull/259, github.com/jnunemaker/mongomapper/issues/488 Mongoid +1【参考方案12】:

上周用 MongoMapper 做了一些测试,它很稳定,但我发现查询界面有点受限(还有一些 AR 逻辑很古怪),今天切换到 Mongoid,使用起来感觉好多了 - 如果你已经习惯了 AR。

目前还没有速度结论 - 但切换很轻松 - 它也适用于 Rails 3。

【讨论】:

【参考方案13】:

我希望性能保持不变,上次我检查 MongoMapper 缺乏 Rails 3 支持 - 所以我现在正在研究 Mongoid。

【讨论】:

【参考方案14】:

你安装了 mongo_ext 吗? 我认为性能更多地与驱动程序有关,而不是映射器本身。在查看 mongo 日志时,我可以看到没有扩展名,transer 似乎有一些滞后。

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

【讨论】:

ruby 驱动程序不是那么快,尤其是 1.8,但 1.9 只是提高了性能!我只是想知道 mongoid 是否更加优化,或者它提供的唯一东西是一种不同的查询方法,暂时 mongomapper 几乎功能齐全,提供几乎所有 AR 糖​​span> 一年后阅读这篇文章的人请注意:mongo_ext 不再需要,并且已被纳入基本的mongo gem。

以上是关于Mongoid 还是 MongoMapper? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ruby​​ 中使用 MongoMapper 重命名数据库?

MongoMapper 避免在 Ruby on Rails 中导致 N+1 查询

如何跳过 Mongoid 文档的回调?

Mongoid 时间戳索引

Mongoid / Mongodb 和查询嵌入文档

gem 'mongoid', '~> 4' 是不是等于 gem 'mongoid', '>= 4'?