我正在尝试使用PouchDB / CouchDB来处理map / reduce查询。
我的数据库中有很多文档,但我需要创建一个查询文档的设计,并将所有独特的团队名称作为关键字然后告诉我
a)每个团队中有多少独特的病房
b)每个团队(所有病房)的工作总数
我的数据结构是:
{
"_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份工作
e.g。
{
"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然后我会看到独特的团队(好)和出现次数(也很棒)但我不确定如何扩展reduce函数以包括作业总数。
答案 0 :(得分:1)
首先,您必须发出作业长度(具有作业数):
function (doc) {
emit([doc.team,doc.ward],doc.jobs.length);
}
然后,你需要一个像这样的reduce函数:
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;
}
对于第一次迭代,我们返回一个对象(统计数据),其中包含病房perm团队的数量(uniq)和工作数量(我们总结每个团队/病房的工作长度。
然后,对于rereduce,我们只是聚合对象的值。