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

这种方法确实有效,但这是遍历对象并更新每个对象的最佳方法吗?有没有更好的方法来计算玩家的等级?

最佳答案

另一种方法是通过执行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保存到数据库的连接)

10-04 21:13