2011-08-09 7 views
1

mongoDB DBのレコードを更新する必要があるコードがあります。だから私はまずレコードを見つけて、レコードを更新します。しかし、レコードには多くのテキストデータが格納されているため、ドキュメントを取得するときにドキュメント全体を取得する必要はありません。私はそれを更新することができます。 mongoidで "only(...)"メソッドを使用すると、その属性だけが返されると思いました。これらのクエリは非常に遅く実行されているように見えるので、達成していると思ったことを達成しているかどうかはわかりませんでした。MongoDB/mongoid update_attributesメソッドが遅いですか?

d = Document.only(:title).find(title) # using 'title' as key in mongoDB 
d.update_attributes({ author: "author_name" }) 

この目的のクエリを高速に実行する方法はありますか?

答えて

0

MongoDBには、高度に最適化された修飾子操作が多数用意されています。 $set操作を使用して、ドキュメントの残りの部分を処理することなく、単一のキーのみを設定します。また、更新とクエリを1回の操作で実行することもできます。指定されたtitleですべてのレコードのauthorを更新するために、ネイティブのMongoDBのクエリは次のようになります。

var title = "The Title" 
db.documents.update({ title: title }, { $set: { author: "The Author" } }) 

うまくいけば、あなたはMongoid経由に沿って、そのクエリを渡す方法を見つけることができます。そうでない場合は、ネイティブMongoアダプタに直接移動して実行することができます。詳細は、docs on modifier operationsをご覧ください。

+0

答えに追加する、 'Document.where(title:title).update_all(著者:"著者 ")'。しかし、これはバリデーションをスキップします。 – rubish

+0

これは、ジャコブラが現在行っていることと機能的に同等です。これは '$ set'演算子で、レコード全体をフェッチせずにレコードの一部を更新することができます。 – Emily

+0

このクエリは、ドキュメントを取得せずに '$ set'に変換されます。ちょうど良い構文:) – rubish

0

コレクションの2つのコレクション(名前、著者、年発行、numPagesなど)のメタデータを持つコレクションと、外部キーを持つコレクションMongoDBの_id)とテキストそのものです。それで、小さなコレクションで著者名のようなものを修正することができます。これはもっと速く実行すると信じています。何かをテストすると思います。しかし、あなたのスピードの問題はレコードのサイズに起因すると思います。個人的には、多くの属性を持たない単純なテストデータセットからレコードごとに多くの属性を持つ実際のデータセットに至るまで、パフォーマンスが大幅に低下することに気付きました。

関連する問題