我尝试过 MongoMapper,它功能齐全(提供几乎所有 AR 功能),但我对使用大型数据集时的性能不太满意。有没有人和Mongoid比较过?任何性能提升?
14 回答
我使用 MongoMapper 有一段时间了,但决定迁移到 MongoId。原因是隐藏的问题加上对用户的傲慢。为了让 MongoMapper 与 Cucumber 一起工作(最终成功),我不得不跳过一些环节,并且即使项目很简单,也需要打几个补丁,但这不是重点。当我尝试提交错误修复(由于与 ActiveRecord 不兼容)时,他们似乎很生气,因为我发现了一个问题,我被推来推去。在我进行测试时,我还遇到了他们的查询实现的一个主要错误,而他们的测试以测试通过的方式进行了调整。根据我之前的经验,不敢提交。
与 MongoId 相比,他们的拉取请求和错误/功能提交的数量要少得多,即社区参与度要低得多。和我一样的经历?
我不知道哪个现在有更多的功能,但我看不到 MongoMapper 的未来。我不介意自己解决问题和添加功能,但我确实介意他们无法修复错误的情况。
在过去的几周里,我一直在使用这两种方法。Mongoapper 对关系关联(非嵌入式)有更好的支持,第三方支持也更大。Mongoid 有更好的查询支持、更好的文档(MM 几乎没有,尽管一个网站据说正在开发中)、Rail 3 支持(因此也支持 Devise)以及在 Google Groups 上稍微活跃的社区。
我最终选择了 Mongoid。
差异
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
蒙古族
我发现的一个区别是,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 中更加“圆润”和完整,这可能解释了它是一个更大的代码库。它似乎也有更好的记录。
你安装了 mongo_ext 吗?我认为性能更多地与驱动程序有关,而不是映射器本身。在查看 mongo 日志时,我可以看到没有扩展名,transer 似乎有一些滞后。
也按照他们在 monogdb 网站上的建议进行操作,只选择您需要的字段。
上周用 MongoMapper 做了一些测试,它很稳定,但我发现查询界面有点有限(还有一些 AR 逻辑很古怪),今天切换到 Mongoid,使用起来感觉好多了 - 如果你用过,更直观到 AR。
还没有速度结论——但切换很轻松——它也适用于 Rails 3。
如果您使用的是 Rails3,我推荐 Mongoid——它还使用“include”而不是继承“<”来持久化类——使用“include”是 Ruby 中添加持久性的更好范例。Mongoid 对我来说很好用 Devise。
为了提高性能,请尝试有选择地使用较低级别的访问权限,例如 Moped - 我已经看到它的速度提高了 10 倍
我认为 Mongoid 在配置和映射方面要好得多。
我使用了它们,它们的功能差不多,但是看看它的代码统计
看起来 MongoMapper 的代码质量要好得多(如果它用更少的代码做同样的事情)。
您可以自己计算此统计信息,这是分析器https://github.com/alexeypetrushin/code_stats
sudo gem install mongo_ext
是获得性能的关键。
MongoDB 在原始速度方面击败了 CouchDB——尽管 CDB 确实有其自身的优势。
我希望性能是一样的,上次我检查 MongoMapper 缺乏 Rails 3 支持 - 所以我现在正在看 Mongoid。
Devise 不支持 MongoMapper,我也更喜欢以 Rails3 方式移动。所以我切换到mongoid。
我希望以下几点为上述答案增添价值。
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风格查找器。