Cloudant自定义排序

时间:2017-04-14 21:00:45

标签: couchdb ibm-cloud cloudant python-cloudant nosql

我的数据如下

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

我希望看到结果按照col1/sum(col2)

的比率的降序排序

其中sum(col2)是指sum所有值的col2。我对cloudant有点新意,所以我不知道最好的办法是什么。我可以想到几个选择。

  1. sum(col2)创建一个新列,并使用col2
  2. 的每个新值继续更新
  3. 对于每条记录,还要创建一个新列col1/sum(col2)。然后我可以对这个专栏进行排序。
  4. 使用视图动态计算比率和总和。这样我就不必存储新列,而且我不必对每次更新执行昂贵的计算。
  5. 我尝试创建一个视图,地图功能很简单

    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;
      }
    }
    

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

1 个答案:

答案 0 :(得分:2)

两条评论:

  1. X/sum(Y)订购与X订购相同(如果-X为否定,则按sum(Y)排序)。因此,对于订购目的,只需按X订购,为您节省一大堆麻烦。

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