如何在Cloudant中实现多重聚合作为选择总和(sal),平均值(得分),empId形式的员工?

时间:2017-05-29 09:56:31

标签: couchdb cloudant nosql

如何在Cloudant中实现以下查询?

SELECT companyId, AVG(score), SUM(sal), dept 
FROM employee 
WHERE ((joiningdate = ?) 
  AND (empid IS NOT NULL)) 
GROUP BY empId, companyId, dept 

对于单个聚合,我可以在我的emit语句中将该属性定义为值,例如,如果我想得到sal的总和,那么我的emit就像emit([doc.companyId, doc.score,doc.dept], doc.sal),而我的reduce将返回doc.sal的总和。

但现在在我的情况下,我必须在两个字段上应用聚合。我们如何在Cloudant中实现这一目标?

1 个答案:

答案 0 :(得分:0)

您可以尝试定义自定义缩小功能。

例如,如果您的Map函数与此类似:

function (doc) {
  if (doc.companyId) {
    emit([doc.companyId, doc.dept], {"score": doc.score, "sal": doc.sal});
  }
}

那么你的Reduce函数可能是这样的:

function (keys, values, rereduce) {
  sal = sum(values.map(function (v) {return v.sal}));
  score = sum(values.map(function (v) {return v.score})) / values.length;

  return {"score": score, "sal": sal};
}