使用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
这种方法确实有效,但这是迭代对象并更新每个对象的最佳方法吗?有没有更好的方法来计算球员的排名?
答案 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
)