83

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

4

14 回答 14

49

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

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

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

于 2011-08-14T23:39:07.490 回答
39

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

我最终选择了 Mongoid。

于 2010-07-22T19:08:40.040 回答
37

差异

MongoMapper

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

蒙古族

  • 轶事证据表明它比 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

蒙古族

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

第三方库

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

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

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

提交活动

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

MongoMapper

MongoMapper

蒙古族

蒙古族

于 2012-12-28T03:15:53.893 回答
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

On save,MongoMapper 将保存整个profile记录,但 MongoId 将使用$set具有位置逻辑的运算符来仅更新更改的标签。

另一个问题是选择要返回的字段。两者都支持only标准,但 Mongoid 也支持without标准,这是 Mongo 原生支持的。

在我看来,Mongoid 只是在其 API 中更加“圆润”和完整,这可能解释了它是一个更大的代码库。它似乎也有更好的记录。

于 2012-04-25T06:14:51.703 回答
7

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

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

于 2009-12-25T05:42:10.423 回答
4

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

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

于 2010-07-20T18:12:55.117 回答
4

如果您使用的是 Rails3,我推荐 Mongoid——它还使用“include”而不是继承“<”来持久化类——使用“include”是 Ruby 中添加持久性的更好范例。Mongoid 对我来说很好用 Devise。

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

于 2011-03-31T11:42:58.380 回答
3

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

于 2010-09-13T19:00:43.997 回答
3

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

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

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

于 2011-08-03T20:13:04.553 回答
0

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

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

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

于 2009-12-25T05:45:12.877 回答
0

我希望性能是一样的,上次我检查 MongoMapper 缺乏 Rails 3 支持 - 所以我现在正在看 Mongoid。

于 2010-06-13T15:44:36.800 回答
0

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

于 2011-02-26T19:31:08.637 回答
0

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

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

在这里查看性能http://mongoid.org/performance.html

于 2011-08-26T10:08:07.257 回答
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 拥有更大的社区,并且可能有更多的 3rd 方库支持。我对文档和 rdoc 发疯了。

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

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

于 2013-11-14T06:08:08.730 回答