Cloudant 自定义排序

Cloudant Custom Sort

我的数据如下

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

我想看结果按col1/sum(col2)

的比例降序排列

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

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

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

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

但我对 reduce 模板感到困惑

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

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

两条评论:

  1. X/sum(Y) 排序与按 X 排序相同(如果 sum(Y) 为负,则按 -X 排序)。因此,为了订购目的,只需按 X 订购即可,省去很多麻烦。

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