Cloudant Custom Sort
У меня есть мои данные следующим образом
{
"key":"adasd",
"col1"::23,
"col2":3
}
Я хочу видеть результаты, отсортированные в порядке убывания соотношения col1/sum(col2)
где sum(col2)
относится к sum
всех значений col2
, Я немного новичок в облачной среде, поэтому я не знаю, как лучше всего к этому подойти. Я могу придумать несколько вариантов.
- Создать новый столбец для
sum(col2)
и продолжайте обновлять его с каждым новым значениемcol2
- Для каждой записи также создайте новый столбец
col1/sum(col2)
, Тогда я могу отсортировать по этому столбцу. - Используйте Views, чтобы вычислить соотношение и сумму на лету. Таким образом, мне не нужно хранить новые столбцы, плюс мне не нужно выполнять дорогостоящие вычисления для каждого обновления.
Я попытался создать вид, и функция карты достаточно проста.
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 ответ
Два комментария:
Заказ по
X/sum(Y)
так же, как заказ поX
(или-X
еслиsum(Y)
отрицательно). Так что для заказа, просто закажитеX
и сэкономить кучу хлопот.Предполагая, что вы действительно хотите знать ценность
X/sum(Y)
и не просто упорядочить его, в CouchDB нет одношагового способа сделать это. Лучшее, что я могу придумать, - это создать карту / уменьшить вид, который дает вам глобальныйsum(Y)
, Затем вы можете получить эту сумму с помощью простого запроса и выполнить математические операции в приложении при получении документов.