2012-03-10 19 views
3

我正試圖通過查找文檔中某個特定字段的最頻繁出現的值來降低聚合級別,從而將其降至指定級別。在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 
} 

地圖功能基本上發出的這些文檔重新連鍵爲[year, month](雖然如果需要的話我可以包括該類別)。我減少到減少到最頻繁出現的類別。

在我上面的例子中,group = false,level_1和level_2都應該減少到「藍色」。

我以爲試圖將密鑰更改爲[year, month, category],希望在我向上移動聚合時可以對類別值進行計數。但這似乎並不奏效。

我如何找到類別最頻繁出現的值?我覺得答案很簡單,但我只是沒有連接點。

謝謝。

回答

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; 
      }" 
     } 
    } 
} 
+0

...容易出錯,但至少你可以試試這個方法 – sinm 2012-03-15 20:40:54

+0

我喜歡它。您的for循環從1開始。我認爲這是因爲您在for循環之前設置了agg = values [0]。但是,那麼你不要跳過爲第一個聚合添加1?謝謝。我會給這個旋轉。 – user791770 2012-03-15 21:55:47

+0

這甚至應該使用原始文檔中的值來代替1。基本上是文檔中的值的總和而不是文檔的計數。尼斯。謝謝。 – user791770 2012-03-15 21:57:18

相關問題