« MongoDBをアプリで使う時に気をつける点 | トップページ | Mongorilla: Object Document Mapper for MongoDB »

2011年11月27日 (日)

Mongoidの限界について

Mongoidの限界

  1. 条件指定のupdateができない。
  2. $incと$pushが同時に使えない。
  3. Hash,Arrayのフィールドに対して、一部のキーのみの更新ができない
  4. save時に参照する必要のないHas_oneの関連のクエリを発行
  5. 変更したオブジェクトに対してreloadを実行すると不整合になる

条件指定のupdateができない

アイテム購入時に、金額が$200以上保持している場合のみ、アイテムを付与するといった
ことができない。アプリケーションが1プロセスの場合は、事前に取得したレコードの金額
を比較することで対処できるが、複数プロセスの場合は、事前に取得したレコードの内容
と更新時のレコードの内容が等しいとは限らないため、更新時に$200以上の場合のみアイテム
付与といったことをMongoDBでする必要がある。

$incと$pushが同時に使えない

Arrayでデータを保存していて、配列のサイズが10以下の場合のみ更新するという場合、
配列のサイズをに対して$gtや$ltなどの比較演算子が使えない($sizeで一致の場合は使える)
ため、Arrayのサイズを記憶するフィールドを別に持つ必要があり、その場合、$pushと$incを
同時に発行する必要がある。

Hash,Arrayのフィールドに対して、一部のキーのみの更新ができない。

{'a' : 1}の値があるフィールドに'b' : 2のデータを追加して更新すると{'a' : 1,'b': 2}とすべての
データで更新してしまうため、他のプロセスが更新したデータを上書きしてしまう。

save時に参照する必要のないHas_oneの関連のクエリを発行

データサイズを小さくするために、あまり参照されないデータは、has_oneの関係で外出しに
するが、関連元のレコードをsaveする際に、外出しにしているhas_oneのレコードにfindの
クエリを発行するため、せっかく外出しにした意味がなくなる。

変更したオブジェクトに対してreloadを実行すると不整合になる

上記の理由により、MongoDriverから直にデータをDBを更新し、Mongoidのオブジェクトを
整合性を取るために更新した内容にセットした状態で、そのオブジェクトにreloadを実行すると

同じレコードが重複したりする。

まとめ

MongoidはActive Modelをincludeしていて、ActiveRecordに慣れたユーザが簡単に導入できるという利点がある。 ただ、高負荷がかかり、データの不整合が許されないような現場で使用するには問題がある。 その対応策として、MongorillaというObject Document Mapperを自作した。 次回はその紹介をしたい。

|

« MongoDBをアプリで使う時に気をつける点 | トップページ | Mongorilla: Object Document Mapper for MongoDB »

MongoDB」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/68673/53346167

この記事へのトラックバック一覧です: Mongoidの限界について:

« MongoDBをアプリで使う時に気をつける点 | トップページ | Mongorilla: Object Document Mapper for MongoDB »