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

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

【问题讨论】:

    标签: ruby mongodb mongoid mongomapper odm


    【解决方案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 的语法进行查询。

      相似之处

      • 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
      

      第三方库

      双方都声称拥有更好的第 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,不要构建可怕的文档。
            【解决方案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。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-10
                • 2011-07-03
                • 2011-03-27
                相关资源
                最近更新 更多