在CouchDB中,如何找到最常出现的值?

时间:2012-03-10 23:19:15

标签: couchdb

我试图通过查找减少到给定级别的文档中特定字段的最常出现值来对聚合级别进行分类。

我有这样的文件:

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

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

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

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

map函数基本上用[year, month]键将这些文件发回(虽然我可以在需要时包含该类别)。我减少然后减少到最常出现的类别。

对于上面的示例,group = false,level_1和level_2都应该减少为“blue”。

我想过尝试将密钥更改为[year, month, category],希望在向上移动聚合时可以计算类别值。但这似乎不起作用。

如何找到类别中最常出现的值?我觉得答案很简单,但我只是没有连接点。

感谢。

1 个答案:

答案 0 :(得分:1)

这很简单但不简洁,因为我已经解决了。

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