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

在CouchDB中,如何找到最常出现的值?,couchdb,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: 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”

我想尝试将键更改为
[年、月、类别]
,希望在向上移动聚合时可以计算类别值。但这似乎不起作用

如何找到类别中最常出现的值?我觉得答案很简单,但我只是没有把这些点联系起来


谢谢。

这本书很简单,但不像我写的那样简洁

{
   "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;
           }"
       }
   }
}
{
“意见”:{
“most_类别”:{
“地图”:“功能(文档){
如果(单据类别和单据年份和单据月份){
var hash={};
散列[单据类别]=1;
发出([doc.year,doc.month],散列);
}
}",
“减少”:“功能(键、值、减少){
var agg=值[0];
对于(变量i=1;iif(大多数国家我喜欢它。for循环从1开始。我想这是因为您设置了agg=value[0]在for循环之前。但是你不跳过将1添加到第一个聚合吗?谢谢。我会尝试一下。这甚至可以用于原始文档中的值,而不是1。基本上是文档中的值的总和,而不是文档数。很好。谢谢。