Reputation: 1007
I have a collection that looks something like this:
db.GE_qstat_job_monitor.findOne()
{
"_id" : ObjectId("53fdf4bbe4b08d3f98fd6bcf"),
"JB_job_number" : NumberLong(45759),
"JB_script_file" : "/opt/UGE-8.1.7/examples/jobs/sleeper.sh",
"JB_owner" : "root",
"JB_job_name" : "Sleeper",
"job_state" : "Completed",
"submission_time" : ISODate("2014-08-26T22:27:51Z"),
"end_time" : ISODate("2014-08-27T15:17:49.564Z"),
"wall_clock" : NumberLong(60598),
"JB_pe" : "smp"
}
I need to group each document by "JB_owner" then by "job_state" (since each owner might have several job with different state) and then count how many job from each state each owner has.
I found another question here in stackoverflow but didn't help any help or hint would be VERY appreciated :-)
Upvotes: 0
Views: 79
Reputation: 64312
Assuming your collection is called Jobs
, this should work:
var DEFAULT_DATA = {
Completed: 0,
Suspended: 0,
Running: 0,
Queue: 0,
cpu: 0,
wall_clock: 0
};
var jobs = Jobs.find().fetch();
var dataByOwner = {};
_.each(jobs, function(job) {
if (dataByOwner[job.JB_owner] == null)
dataByOwner[job.JB_owner] = _.clone(DEFAULT_DATA);
dataByOwner[job.JB_owner][job.job_state] += 1;
dataByOwner[job.JB_owner].wall_clock += job.wall_clock || 0;
dataByOwner[job.JB_owner].cpu += job.cpu || 0;
});
var result = _.map(dataByOwner, function(data, owner) {
var cpu = data.cpu;
var wall_clock = data.wall_clock;
delete data.cpu;
delete data.wall_clock;
return {
JB_owner: owner,
job_state: data,
cpu: cpu,
wall_clock: wall_clock
};
});
console.log(result);
Upvotes: 1