Cloudant Custom Sort

У меня есть мои данные следующим образом

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

Я хочу видеть результаты, отсортированные в порядке убывания соотношения col1/sum(col2)

где sum(col2) относится к sum всех значений col2, Я немного новичок в облачной среде, поэтому я не знаю, как лучше всего к этому подойти. Я могу придумать несколько вариантов.

  1. Создать новый столбец для sum(col2) и продолжайте обновлять его с каждым новым значением col2
  2. Для каждой записи также создайте новый столбец col1/sum(col2), Тогда я могу отсортировать по этому столбцу.
  3. Используйте 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 ответ

Решение

Два комментария:

  1. Заказ по X/sum(Y) так же, как заказ по X (или -X если sum(Y) отрицательно). Так что для заказа, просто закажите X и сэкономить кучу хлопот.

  2. Предполагая, что вы действительно хотите знать ценность X/sum(Y)и не просто упорядочить его, в CouchDB нет одношагового способа сделать это. Лучшее, что я могу придумать, - это создать карту / уменьшить вид, который дает вам глобальный sum(Y), Затем вы можете получить эту сумму с помощью простого запроса и выполнить математические операции в приложении при получении документов.

Другие вопросы по тегам