Mongodb Map/reduce grouping

Hi,

I have two model, challenge(embeds_many :tasks) and task(embedded_in
:challenge),
finally database structue is like this

{ “_id” : ObjectId(“4db8b0524f0b495c3a7dbba4”), “title” : “Testing1”,
“created” : ISODate(“2011-12-12T00:00:00Z”),
“tasks” : [
{
“name” : “task no 1”,
“score” : “5”
},
{
“name” : “task no2”,
“score” : “6”
}
] }

{ “_id” : ObjectId(“4db8b0524f0b495c3a7dbba5”), “title” : “Testing2”,
“created” : ISODate(“2011-12-12T00:00:00Z”),
“tasks” : [
{
“name” : “task no 1”,
“score” : “7”
},
{
“name” : “task no2”,
“score” : “8”
}
] }

Here i have to select top 5 challenges having highest task score. I am
using mongodb as database and i come to know
there is concept of “Map/reduce grouping” but not able to figure it out.

i was writting this code in my controller but it become more
complicated.

def whowins
@challenge = Challenge.where(:_id =>
“4ef1a6a454b53001a4000067”).first
$wins ={“first”=>{“id”=>“1”, “score”=>“1”},“second”=>{“id”=>“2”,
“score”=>“2”},“third”=>{“id”=>“3”, “score”=>“3”},“fourth”=>{“id”=>“4”,
“score”=>“4”},“fifth”=>{“id”=>“5”, “score”=>“5”}}
temp ={“id”=>“10”,“score”=>“20”}
aTotalScore = 0

if @challenge.instance_of?Challenge

  @challenge.tasks.each_with_index do |orgTasks,index|
      aTotalScore += orgTasks.score.to_i
  end
  $wins["first"]["id"]= @challenge.user_id
  $wins["first"]["score"]= aTotalScore
  aTotalScore = 0

  @challenge.child_challenges.each do |aChildChallenge|
      aChildChallenge.tasks.each_with_index do |eachTasks,index|
          aTotalScore += eachTasks.score.to_i
      end
      #raise aTotalScore.inspect
      if aTotalScore > $wins["first"]["score"]
          #raise "first less"
          whoWinning aTotalScore, $wins["first"]["score"],

aChildChallenge.user_id, 1
aTotalScore = 0
next if aTotalScore = 0
elsif aTotalScore > $wins[“second”][“score”]
#raise “decond less”
whoWinning aTotalScore, $wins[“second”][“score”],
aChildChallenge.user_id, 2
aTotalScore = 0
next if aTotalScore = 0
elsif aTotalScore > $wins[“third”][“score”]
#raise “third less”
whoWinning aTotalScore, $wins[“third”][“score”],
aChildChallenge.user_id, 3
aTotalScore = 0
next if aTotalScore = 0
elsif aTotalScore > $wins[“fourth”][“score”]
#raise “fourht less”
whoWinning aTotalScore, $wins[“fourth”][“score”],
aChildChallenge.user_id, 4
aTotalScore = 0
next if aTotalScore = 0
else
#raise “fifth less”
whoWinning aTotalScore, $wins[“fifth”][“score”],
aChildChallenge.user_id, 5
aTotalScore = 0
next if aTotalScore = 0
end
end

else
raise “childchallenge”
end
end

private

def whoWinning(tempScore, winnerScore, winnerId, aPossition )
aTScore = 0
aTId = 0
if aPossition == 5
$wins[“fifth”][“score”],$wins[“fifth”][“id”] =
tempScore,winnerId
raise $wins.inspect
return
else
if aPossition == 1
aTScore,$wins[“first”][“score”] =
$wins[“first”][“score”],tempScore
aTId = $wins[“second”][“id”]
$wins[“second”][“score”],$wins[“first”][“id”] =
aTScore,winnerId
if $wins[“third”][“score”].to_i > $wins[“second”][“score”]
whoWinning $wins[“third”][“score”],
$wins[“second”][“score”], aTId, 2
else
return
end
end

    if aPossition == 2
        aTScore,$wins["second"]["score"] =

$wins[“second”][“score”],tempScore
aTId = $wins[“third”][“id”]
$wins[“third”][“score”],$wins[“second”][“id”] =
aTScore,winnerId
if $wins[“fourth”][“score”] > $wins[“third”][“score”]
whoWinning $wins[“fourth”][“score”],
$wins[“third”][“score”], aTId, 3
else
return
end
end

    if aPossition == 3
        aTScore,$wins["third"]["score"] = 

$wins[“third”][“score”],tempScore
aTId = $wins[“fourth”][“id”]
$wins[“fourth”][“score”],$wins[“third”][“id”] =
aTScore,winnerId
if $wins[“fifth”][“score”] > $wins[“fourth”][“score”]
whoWinning $wins[“fifth”][“score”],
$wins[“fourth”][“score”], aTId, 4
else
return
end
end

    if aPossition == 4
        aTScore,$wins["fourth"]["score"] =

$wins[“fourth”][“score”],tempScore
aTId = $wins[“fifth”][“id”]
$wins[“fifth”][“score”],$wins[“fourth”][“id”] =
aTScore,winnerId
#whoWinning $wins[“fifth”][“score”],
$wins[“fourth”][“score”], aTId, 5
end
end
end

I m new to mongodb, any help or suggetion will be highly apreciated.
Tks in advance

+++++++++++++++++++++++
Pravin M.