使用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
保存到数据库的连接)