私は MongoMapper を試してみましたが、完全な機能 (ほぼすべての AR 機能を提供) ですが、大規模なデータセットを使用するときのパフォーマンスにはあまり満足できませんでした。Mongoidと比較した人はいますか?パフォーマンスの向上はありますか?
14 に答える
しばらく MongoMapper を使用していましたが、MongoId に移行することにしました。その理由は、隠れた問題とユーザーに対する傲慢さです。MongoMapper を Cucumber で動作させる (最終的には成功した) ため、そしてプロジェクトが単純であってもいくつかのパッチを適用するために、私はフープをジャンプする必要がありましたが、それはポイントではありません。(ActiveRecord との互換性がないため) バグ修正を提出しようとしたとき、彼らは私が問題を発見したことに腹を立てたようで、押しのけられました。私がテストしている間、クエリの実装で大きなバグに遭遇しましたが、テストが合格するようにテストが調整されていました。以前の経験の後、あえて提出しませんでした。
MongoId よりもプル リクエストとバグ/機能の送信の数が大幅に少なく、コミュニティへの参加がはるかに少なくなっています。私と同じ経験?
現時点ではどちらがより多くの機能を備えているかはわかりませんが、MongoMapper にはあまり将来性がありません。自分で問題を修正して機能を追加することは気にしませんが、バグが修正されない状況は気にします。
私は過去数週間、両方を使用しています。Mongomapper は、リレーショナル アソシエーション (非埋め込み) のサポートが強化されており、サード パーティのサポートが強化されています。Mongoid はより優れたクエリ サポート、はるかに優れたドキュメント (Web サイトはおそらく作成中ですが、MM にはほとんどありません)、Rail 3 サポート (したがって、Devise サポート)、および Google グループのコミュニティがわずかに活発です。
私は最終的にMongoidに行きました。
違い
MongoMapper
- リレーショナル アソシエーションのサポートが向上していると主張されています。
- プラグイン アーキテクチャであるため、より拡張可能であると主張されています。
- クエリに DSL を使用します。
- 多対多の関連付けは、MongoMapper で一方的にのみ更新されます。
- 埋め込みドキュメントのサポートはそれほど堅牢ではありません。いくつかの属性のみが変更された場合でも、モデル全体を更新します。
モンゴイド
- 逸話的な証拠により、MongoMapper よりも高速であることが示唆されています。
- MongoDB のアトミック操作 ($set、$push、$pull など) を使用して、ネストされたドキュメントをインプレースで更新する、埋め込みドキュメントのより堅牢なサポート。
- 双方向の多対多の関連付けをサポートします。
- クエリには連鎖可能な ARel に似た構文を使用します。
類似点
- MongoMapperとMongoidの両方に、優れたドキュメントを備えた Web サイトがあります。MongoMapper は長い間、文書の質が悪いと主張されていましたが、彼らの新しい Web サイトはそのギャップを埋めているようです。
- どちらも 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 は次のことを明らかにします。
- 「モンゴイド」で検索すると、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
では、 MongoMapperはレコードsave
全体を保存しますが、 MongoId は位置ロジックを持つ演算子を使用して、変更されたラベルのみを更新します。profile
$set
もう 1 つの問題は、返すフィールドを選択することです。どちらもonly
基準をサポートしていますが、Mongoid もwithout
基準をサポートしており、これは Mongo によってネイティブにサポートされています。
私には、Mongoid の方がより「丸みを帯びて」おり、その API が完全であるように見えます。これはおそらく、Mongoid がより大きなコード ベースであることを説明しています。また、より適切に文書化されているようです。
mongo_ext をインストールしましたか? パフォーマンスは、マッパー自体よりもドライバーに関連していると思います。mongo のログを見ると、拡張子がなくても、transer に遅延があるように見えます。
また、monogdb サイトで推奨されているように、必要なフィールドのみを選択してください。
Rails3を使用している場合は、Mongoidをお勧めします。クラスを永続化するために継承「<」の代わりに「include」も使用します。永続性を追加するには、Rubyで「include」を使用する方が優れたパラダイムです。Mongoidは、Deviseで問題なく動作します。
パフォーマンスを向上させるには、低レベルのアクセスを選択的に使用してみてください。たとえば、Moped-これは最大10倍高速であることがわかりました。
先週 MongoMapper でいくつかのテストを行いましたが、安定していましたが、クエリ インターフェイスが少し制限されていることがわかりました (また、AR ロジックのいくつかは風変わりでした)。今日 Mongoid に切り替えました。 ARに。
速度に関する結論はまだ出ていませんが、切り替えは簡単でした。Rails 3 でも動作します。
私はそれらの両方を使用しましたが、機能的にはほぼ同等ですが、コード統計を見てください
MongoMapper のコード品質ははるかに優れているようです (より少ないコードで同じことを行う場合)。
この統計は自分で計算できます。アナライザーはこちらhttps://github.com/alexeypetrushin/code_stats
Mongoid は、構成とマッピングにおいてはるかに優れていると思います。
Devise は MongoMapper をサポートしていませんでした。私も Rails3 の方法で移行することを好みます。だから私はモンゴイドに切り替えました。
Mongoid は Rails3 を完全にサポートし、ID マップ機能を備えています。
詳細なドキュメントはhttp://mongoid.orgにあります
ここでパフォーマンスを参照してください http://mongoid.org/performance.html
前回MongoMapperがRails 3をサポートしていないことを確認したとき、パフォーマンスは同じであると予想されます。そのため、今のところMongoidを検討しています。
sudo gem install mongo_ext
パフォーマンスを得るための鍵です。
MongoDB は生の速度の点で CouchDB を圧倒しますが、CDB には独自の利点があります。