MongoDB + Ruby:在迭代中更新记录

时间:2012-02-02 19:55:53

标签: ruby mongodb

使用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

这种方法确实有效,但这是迭代对象并更新每个对象的最佳方法吗?有没有更好的方法来计算球员的排名?

1 个答案:

答案 0 :(得分: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 )

(代码假设您在mongo中有一个“players”集合,以及一个包含数据库连接的ruby变量cn