2014-08-28 57 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