2017-04-03 67 views
0

我正試圖在使用PouchDB/CouchDB時處理map/reduce查詢。如何在CouchDB中使用GROUP BY reduce函數

我有很多在我的數據庫文件,但我需要創建一個查詢文件,並給了我所有的獨特的團隊名稱作爲關鍵的設計,然後告訴我

一)有多少獨特的病房每隊

二)每隊作業總數(在所有病房)

我的數據的結構中:

{ 
    "_id": "0448071807c0f37f53e06aab54034a42", 
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957", 
    "team": "Team A", 
    "ward": "Ward A", 
    "date": "2017-03-30", 
    "person": "Alice", 
    "bed": "Bed 001", 
    "jobs": [1,2,3,4] 
} 

{ 
    "_id": "0448071807c0f37f53e06aab54034a42", 
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957", 
    "team": "Team A", 
    "ward": "Ward B", 
    "date": "2017-03-30", 
    "person": "Bob", 
    "bed": "Bed 001", 
    "jobs": [1,2] 
} 

{ 
    "_id": "0448071807c0f37f53e06aab54034a42", 
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957", 
    "team": "Team A", 
    "ward": "Ward C", 
    "date": "2017-03-30", 
    "person": "Charles", 
    "bed": "Bed 001", 
    "jobs": [9,5] 
} 

{ 
    "_id": "0448071807c0f37f53e06aab54034a42", 
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957", 
    "team": "Team B", 
    "ward": "Ward 00", 
    "date": "2017-03-30", 
    "person": "David", 
    "bed": "Bed 001", 
    "jobs": [1] 
} 

我希望會是這樣的輸出:

A隊 - 3獨特的病房 - 8就業

B隊 - 1獨特的病房 - 1工作

eg

{ 
    "key": "Team A", 
    "value": { 
     "wards": 3, 
     "jobs": 8 
    } 
} 

{ 
    "key": "Team B", 
    "value": { 
     "wards": 1, 
     "jobs": 1 
    } 
} 

我的地圖是目前:

{ 
    "all": { 
     "map": "function(doc) { emit(doc.team, doc) }" 
    } 
} 

這是減少在我的奮鬥進來

編輯

我已上CouchDB View equivalent of SUM & GROUP BY使用的建議,但此只是走向我的挑戰的一半。

如果我使用:

{ 
    "all": { 
     "map": "function(doc) { emit([doc.team, doc.ward], 1) }", 
     "reduce": "function(keys, values) { return sum(values); }" 
    } 
} 

然後去http://my-ip:5984/wardround_jobs/_design/teams/_view/all?group_level=1然後我看到了獨特的球隊(好)和事件(也很大)的數量,但我不確定我如何延長降低功能包括:就業總數。

+0

可能重複的[CouchDB查看相當於SUM和GROUP BY](http://stackoverflow.com/questions/5511810/couchdb-view-equivalent-of-sum-group-by) – Flimzy

+0

謝謝。我更新了我的問題,因爲我從那篇文章中學到了什麼。它有幫助,但我仍然有點卡住 – Chris

回答

1

首先,你必須發出作業長度(有作業的數量):

function (doc) { 
    emit([doc.team,doc.ward],doc.jobs.length); 
} 

然後,你需要減少這樣的功能:

function (keys, values, rereduce) { 
    var stats = {uniq:0,jobs:0}; 
    if (rereduce) { 
    for(var i=0;i<values.length;i++){ 
    stats.uniq += values[i].uniq; 
    stats.jobs += values[i].jobs; 
    } 
    return stats; 
    } 
    stats.uniq = values.length; 
    stats.jobs = sum(values); 
    return stats; 
} 

對於第一次迭代,我們返回一個對象(統計數據),其中包括病房的數量(uniq)和作業數量(我們將每個團隊/病房的作業長度相加)

然後,對於rereduce,我們簡單地聚合對象`小號值。

+0

這是偉大的,非常有幫助。謝謝。 – Chris