【问题标题】:Joining documents in Couchbase and using aggregate functions在 Couchbase 中加入文档并使用聚合函数
【发布时间】:2019-12-08 06:39:41
【问题描述】:

我有这 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
}

现在我想使用求和函数 Documents 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 No. 的所有标记的总和,但我无法将它与包含名字和姓氏的文档一起加入

【问题讨论】:

  • 我假设你所有的文件都在同一个桶里?
  • @user1697575 是的。都在同一个桶中
  • 到目前为止你做了什么?
  • 添加了我到目前为止所做的事情
  • 如果使用Acc_no的值作为Document 1的主键,可以使用N1QL实现求和和JOIN。

标签: mapreduce couchbase n1ql


【解决方案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 中提取数据。

【讨论】:

  • 你能解释一下你的查询吗?例如,即使您只有一个发射功能,您如何发射两行?
  • 如果您使用?reduce=false 查询视图,您将看到地图函数的输出。由于我们选择的组级别,您在 reduce 输出中得到两行。
猜你喜欢
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多