Ruby on Rails
Friday, December 23, 2011
hi all,
After continuous 10 hours work i fixed it out. below is the code which i written in challenge model.
def self.task_score_map
<<-MAP
function() {
this.tasks.forEach(function(aTask) {
emit(aTask.score, {score: aTask.score});
});
}
MAP
end
def self.task_score_reduce
<<-REDUCE
function(key, values) {
var sum = 0;
values.forEach(function(aScore) {
sum += parseInt(aScore.score);
});
return sum;
}
REDUCE
end
def self.task_score_build(opts)
self.collection.map_reduce(self.task_score_map, self.task_score_reduce, opts)
end
def self.task_score(opts={})
hash = opts.merge({
:out => {:inline => true},
:raw => true
})
self.task_score_build(hash).find()
end
and this is result
#<Enumerator: {"results"=>[{"_id"=>"10", "value"=>{"score"=>"10"}}, {"_id"=>"11", "value"=>{"score"=>"11"}}, {"_id"=>"5", "value"=>30.0}, {"_id"=>"6", "value"=>{"score"=>"6"}}, {"_id"=>"7", "value"=>{"score"=>"7"}}, {"_id"=>"8", "value"=>{"score"=>"8"}}, {"_id"=>"9", "value"=>{"score"=>"9"}}], "timeMillis"=>0, "counts"=>{"input"=>6, "emit"=>12, "reduce"=>1, "output"=>7}, "ok"=>1.0}:find>
i m sorting this a/c to score. but i need a/c to user_id. here user_id belongs to challenge model.
"_id" : ObjectId("4ef1a6a454b53001a4000067"),
"user_id" : "100002573213371",
"title" : "social who wins",
"description" : "social who wins",
"updated_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),
"created_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),
"tasks" : [{
"is_complete" : 0,
"score_by" : "Check box:1 for checking off the task",
"score" : "5",
"name" : "task no 1",
"_id" : ObjectId("4ef1a6a454b53001a4000068")
}, {
"is_complete" : 0,
"score_by" : "Self-report number",
"score" : "6",
"name" : "task no 2",
"_id" : ObjectId("4ef1a6a454b53001a4000069")
}],
}
i need to pass user_id instead of score.
def self.task_score_map
<<-MAP
function() {
this.tasks.forEach(function(aTask) {
emit(this.user_id, {score: aTask.score});
});
}
MAP
end
any idea...............
-- On 23 December 2011 11:38, Pravin Mishra <diatm.pravin.it.07.27@gmail.com> wrote:
Hi Guy's,I am new to map / reduce and trying to figure out a way to collect the following data using map / reduce instead doing it my (slow) application logic:I have a collection 'challenge' with a 1:n relation to a collection 'tasks'. Now I'd like to receive an array of results that gives top five heightest scored challenge.For map I tried something like:map = function () {emit(this.user_id, { count:1 });}and reduce:
reduce = function (key, score) {var sum = 0;score.forEach(function(doc){ sum += 1; });return { count:sum };}I fired this against my tasks collection:var mr = db.tasks.mapReduce(map, reduce, { out: "results" });But I get crucial results when querying:db[mr.result].find();I am using Mongoid on Rails and am completely lost with it. Can someone point me into the right direction?my data something like this/* 13 */{"_id" : ObjectId("4ef1a6a454b53001a4000067"),"user_id" : "100002573213371","title" : "social who wins","description" : "social who wins","updated_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),"created_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),"tasks" : [{"is_complete" : 0,"score_by" : "Check box:1 for checking off the task","score" : "5","name" : "task no 1","_id" : ObjectId("4ef1a6a454b53001a4000068")}, {"is_complete" : 0,"score_by" : "Self-report number","score" : "6","name" : "task no 2","_id" : ObjectId("4ef1a6a454b53001a4000069")}],}/* 14 */{"_id" : ObjectId("4ef1a6a454b53001a400006d"),"canCompleteBeforeTasks" : true,"challenge_id" : ObjectId("4ef1a6a454b53001a4000067"),"created_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),"description" : "social who wins","tasks" : [{"is_complete" : 0,"score_by" : "Check box:1 for checking off the task","score" : "5","name" : "task no 1","_id" : ObjectId("4ef1a6a454b53001a400006e")}, {"is_complete" : 0,"score_by" : "Self-report number","score" : "7","name" : "task no 2","_id" : ObjectId("4ef1a6a454b53001a400006f")}],"title" : "social who wins","updated_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),"user_id" : "100003135115833"}/* 15 */{"_id" : ObjectId("4ef1a6a454b53001a4000073"),"challenge_id" : ObjectId("4ef1a6a454b53001a4000067"),"created_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),"description" : "social who wins","tasks" : [{"is_complete" : 0,"score_by" : "Check box:1 for checking off the task","score" : "5","name" : "task no 1","_id" : ObjectId("4ef1a6a454b53001a4000074")}, {"is_complete" : 0,"score_by" : "Self-report number","score" : "8","name" : "task no 2","_id" : ObjectId("4ef1a6a454b53001a4000075")}],"title" : "social who wins","updated_at" : new Date("Wed, 21 Dec 2011 14:58:04 GMT +05:30"),"user_id" : "100003174704960"}Thx in advance.++++++++++++++++++Pravin Mishra
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment