在Couchbase中加入文档并使用聚合函数

时间:2016-02-26 13:01:11

标签: mapreduce couchdb couchbase n1ql

我有这4个文件

文件1

{
  "First_Name": "dhw",
  "Type": "GLAccount",
  "Acc_no": 1,
  "Last_Name": "irtahow"
}

文件2

{
  "Marks": 13,
  "Type": "GLEntry",
  "Acc_no": 1
}   

文件3

{
  "Marks": 85,
  "Type": "GLEntry",
  "Acc_no": 1
}

文件4

{
  "Marks": 93,
  "Type": "GLEntry",
  "Acc_no": 1
}

现在我想使用sum函数文档2,3和4,然后将它与Document 1连接。所以我的查询结果应该像

Acc_no First_Name   Last_Name      Sum(marks)

1       "dhw"       "irtahow"            191

所以在这里你看到我想首先对特定Acc_No的所有标记求和,然后输出它的标记和名字和姓氏的总和。 我可以对标记求和,但无法模拟连接。

编辑1: 这就是我到目前为止所做的事情

地图功能

function(doc, meta)
{

    emit(doc.No,doc.marks);
}

减少功能

_sum

我获得特定Acc号的所有商标的总和,但我无法将其与包含名字和姓氏的文件一起加入

1 个答案:

答案 0 :(得分:1)

我有点犹豫不决,因为我不确定这会对性能产生什么影响,但这会让你在一个查询中获得数据。

地图功能:

function (doc) {
  var type = doc.Type == "GLAccount" ? 0 : 1;
  var marks =  doc.Marks ? doc.Marks: 0;
  var key = [doc.Acc_no, type];
  if (type === 0){
    key.push(doc.First_Name, doc.Last_Name);
  }
  emit(key, marks);
}

减少功能:

_sum

网址查询:

http://host:5984/db/_design/design/_view/view?group=true

结果:

{"rows":[
{"key":[1,0,"dhw","irtahow"],"value":0},
{"key":[1,1],"value":191}
]}

然后,您需要从JSON中提取数据。