2012-02-02 10 views
2

MongoDBとRubyドライバを使用して、私のアプリのプレイヤーのランキングを計算しようとしているので、(この場合は)プッシュアップでソートしてから、オブジェクトごとにフィールドと値をランク付けします。MongoDB + Ruby:繰り返しでレコードを更新する

pushups = coll.find.sort(["pushups", -1]) 
pushups.each_with_index do |r, idx| 
    r[:pushups_rank] = idx + 1 
    coll.update({:id => r }, r, :upsert => true) 
    coll.save(r) 
end 

このアプローチはうまくいきますが、これはオブジェクトを繰り返し処理してそれぞれを更新する最良の方法ですか?プレーヤーのランクを計算する良い方法はありますか?

答えて

3

別のアプローチは、JavaScriptの機能を実行することで、サーバー上の全体の更新を行うには、次のようになります。

update_rank = "function(){ 
var rank=0; 
db.players.find().sort({pushups:-1}).forEach(function(p){ 
    rank +=1; 
    p.rank = rank; 
    db.players.save(p); 
}); 
}" 
cn.eval(update_rank) 

(コードを使用すると、モンゴで「選手」コレクションを持っていると仮定して、Aを保持ルビー変数cnあなたのデータベースへの接続)

+0

私はそのアプローチが好きです! – yalestar

+0

私はそれも正しいアプローチだと思います。 db.players.update({_ id:p._id}、{$ set:{rank:rank}})または何か –

+1

また、evalロックデータベース全体。これは、多くの同時リクエストがある場合、および/またはプレイヤーが成長すると、規模が拡大しません。 FWIW、MongoDBでも順位を上げていましたが、その特定のロジックをRedisソートセットに切り替えました。私は私の肯定的な経験についてブログしました:http://openmymind.net/2011/5/8/Practical-NoSQL-Solving-a-Real-Problem-w-Mongo-Red/ –

関連する問題