Cloudant 自定义排序
Cloudant Custom Sort
我的数据如下
{
"key":"adasd",
"col1"::23,
"col2":3
}
我想看结果按col1/sum(col2)
的比例降序排列
其中 sum(col2)
指 col2
的 所有 值的 sum
。我对 cloudant 有点陌生,所以我不知道解决这个问题的最佳方法是什么。我可以想到几个选项。
- 为
sum(col2)
创建一个新列,并使用 col2
的每个新值不断更新它
- 对于每条记录,还创建一个新列
col1/sum(col2)
。然后我可以对这一列进行排序。
- 使用 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;
}
}
我不知道如何访问两列的值然后在此处聚合。这可能吗?还有其他方法可以达到我需要的结果吗?
两条评论:
按 X/sum(Y)
排序与按 X
排序相同(如果 sum(Y)
为负,则按 -X
排序)。因此,为了订购目的,只需按 X
订购即可,省去很多麻烦。
假设您确实想知道 X/sum(Y)
的值,而不仅仅是按它排序,那么在 CouchDB 中没有一步完成的方法。我能想到的最好的方法是创建一个 map/reduce 视图,为您提供全局 sum(Y)
。然后,您可以通过一个简单的查询来获取该总和,并在获取文档时在您的应用程序中进行计算。
我的数据如下
{
"key":"adasd",
"col1"::23,
"col2":3
}
我想看结果按col1/sum(col2)
其中 sum(col2)
指 col2
的 所有 值的 sum
。我对 cloudant 有点陌生,所以我不知道解决这个问题的最佳方法是什么。我可以想到几个选项。
- 为
sum(col2)
创建一个新列,并使用col2
的每个新值不断更新它
- 对于每条记录,还创建一个新列
col1/sum(col2)
。然后我可以对这一列进行排序。 - 使用 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;
}
}
我不知道如何访问两列的值然后在此处聚合。这可能吗?还有其他方法可以达到我需要的结果吗?
两条评论:
按
X/sum(Y)
排序与按X
排序相同(如果sum(Y)
为负,则按-X
排序)。因此,为了订购目的,只需按X
订购即可,省去很多麻烦。假设您确实想知道
X/sum(Y)
的值,而不仅仅是按它排序,那么在 CouchDB 中没有一步完成的方法。我能想到的最好的方法是创建一个 map/reduce 视图,为您提供全局sum(Y)
。然后,您可以通过一个简单的查询来获取该总和,并在获取文档时在您的应用程序中进行计算。