Как найти наиболее часто встречающееся значение в CouchDB? - PullRequest
3 голосов
/ 11 марта 2012

Я пытаюсь классифицировать уровни агрегации путем нахождения наиболее часто встречающегося значения определенного поля в документах, которые уменьшены до данного уровня.

У меня есть такие документы:

{ year: 2012,
  month: 01,
  category: blue
},

{ year: 2012,
  month: 01,
  category: blue
},

{ year: 2012,
  month: 01,
  category: blue
},

{ year: 2012,
  month: 01,
  category: green
}

Функция карты в основном выдает эти документы обратно с ключами как [year, month] (хотя я мог бы включить категорию при необходимости). Я уменьшаю, а затем уменьшаю до наиболее часто встречающейся категории.

В приведенных выше примерах group = false, level_1 и level_2 должны быть уменьшены до "blue".

Я думал о попытке изменить ключ на [year, month, category] в надежде, что смогу подсчитать значения категорий по мере продвижения по агрегации. Но это, похоже, не работает.

Как мне найти наиболее часто встречающееся значение для категории? Я чувствую, что ответ прост, но я просто не соединяю точки.

Спасибо.

1 Ответ

1 голос
/ 16 марта 2012

Это просто, но не лаконично, как я с этим справился.

{
   "views": {
       "most_category": {
           "map": "function(doc){
             if (doc.category && doc.year && doc.month) {
                var hash = {};
                hash[doc.category] = 1;
                emit([doc.year, doc.month], hash);
             }
           }",
           "reduce": "function(keys, values, rereduce) {
              var agg = values[0];
              for (var i = 1; i < values.length; ++i) {
                for (var category in values[i]) {
                  if (agg[category]) {
                    agg[category] += values[i][category];
                  } else {
                    agg[category] = values[i][category];
                  }
                }
              }
              var most_category = null;
              var most_count = 0;
              for (var category in agg) {
                if (most_count<agg[category]) {
                  most_category = category;
                  most_count = agg[category];
                }
              }
              var hash = {};
              hash[most_category] = most_count;
              return hash;
           }"
       }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...