2014-08-28 58 views
0

一次算几场我有一个集合,它看起来是这样的:如何GROUP BY和流星

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" 
} 

我需要组中的每个文件由“JB_owner”,然后按“job_state”(因为每个所有者可能有多个工作在不同的状态),然后统计每个拥有者每个州的工作量。

我发现了另一个问题,在这里stackoverflow,但并没有帮助任何帮助或提示将是非常赞赏:-)

+0

做什么你想要输出看起来像?这是在客户端还是服务器上运行? – 2014-08-28 15:08:29

+0

这会在服务器端运行,我想,看起来像这样 { JB_owner: “胡安”, job_state:{ 完成:45, 暂停:2, 运行:1, 队列:0 }, wall_clock:2545972, cpu:0 } – 2014-08-28 15:19:05

+0

我不清楚'wall_clock'和'cpu'该怎么做。 – 2014-08-28 15:22:49

回答

1

假设您的集合称为Jobs,这应该工作:

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); 
+0

它完美的作品!谢谢!!!还有一件事。有没有办法在数据库层做到这一点?因为当我做'Jobs.find()。fetch()'我期望有成千上万的元素,所以结果数组将会很大,以便与 – 2014-08-28 16:16:51

+1

一起工作。下面是一些建议:1)有些人已经完成了像聚合包[这一个](http://atmospherejs.com/mrt/mongodb-aggregation),但我不清楚是否有任何实际维护/工作。 2)至少你可以在'find'中使用'fields'说明符,也可以尝试将作业限制为仅拥有所有者的子集或按日期等。3)可以修改作业模式以便存储它们以一种更加综合的方式,或写入一个单独的集合,它存储类似上述结果的东西,并在作业改变状态时进行修改。 – 2014-08-28 17:30:16