juanp_1982
juanp_1982

Reputation: 1007

how to group by AND count several field at once in meteor

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

Answers (1)

David Weldon
David Weldon

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

Related Questions