1

我的数据如下

{
    "key":"adasd",
    "col1"::23, 
    "col2":3
}

我想查看按比例降序排列的结果col1/sum(col2)

其中sum(col2)指的是sum所有col2。我对 cloudant 有点陌生,所以我不知道解决这个问题的最佳方法是什么。我能想到几个选择。

  1. 为每个新值创建一个新列sum(col2)并不断更新它col2
  2. 对于每条记录,还要创建一个新列col1/sum(col2)。然后我可以在这个列上排序。
  3. 使用视图即时计算比率和总和。这样我就不必存储新列,而且我不必在每次更新时执行昂贵的计算。

我试图创建一个视图,地图功能很简单

function (doc) {
  emit(doc._id, {"col1_value":doc.col1,"col2_value":doc.col2});
}

但我对减少模板感到困惑

function (keys, values, rereduce) {
  if (rereduce) {
    return sum(values);
  } else {
    return values.length;
  }
}

我不知道如何访问两列的值,然后在这里聚合。这甚至可能吗?有没有其他方法可以达到我需要的结果?

4

1 回答 1

2

两条评论:

  1. 排序依据X/sum(Y)与排序依据相同X(或-X如果sum(Y)为负数)。因此,出于订购目的,只需订购X并为自己省去一堆麻烦。

  2. 假设您确实想知道 的值X/sum(Y),而不仅仅是按它排序,那么在 CouchDB 中没有一步法来完成此操作。我能想到的最好的方法是创建一个 map/reduce 视图,为您提供全局sum(Y). 然后,您可以通过一个简单的查询来获取该总和,并在获取文档时在您的应用程序中进行数学运算。

于 2017-04-15T00:17:48.420 回答