2012-11-08 27 views
4

所以從我的Couchbase明白的是,人們可以通過*使用如何對Couchbase中的_View_值進行排序?

descending=true 

但排序鍵在我的情況下,我想通過值而不是進行排序。考慮json格式的Twitter數據,我的問題是最流行的用戶提到了什麼?

每個鳴叫具有以下結構:

{ 
    "text": "", 
    "entities" : { 
     "hashtags" : [ ... ], 
     "user_mentions" : [ ...], 
     "urls" : [ ... ] 
} 

所以曾使用的MongoDB之前予重複使用的地圖的功能和修改它略微爲可用在Couchbase如下:

function (doc, meta) { 
    if (!doc.entities) { return; } 

    doc.entities.user_mentions.forEach(
    function(mention) { 
     if (mention.screen_name !== undefined) { 
     emit(mention.screen_name, null); 
     } 
    } 
) 
} 

然後我使用減少功能_count來統計所有screen_name事件。現在我的問題是如何按計數值排序,而不是按鍵?

感謝

回答

1

簡短的回答是,你可以通過值的查看未排序的結果。你只能按鍵排序。

一些解決辦法將是兩種:

  • 將它們插入到Couchbase之前對數據進行分析,並創建你感興趣的(提到你的情況)

  • 使用的值的計數器如果視圖的大小對於客戶端排序而言是可接受的,則必須對應用程序大小排序視圖。

下面的JS代碼調用視圖,排序結果,並打印10個最熱主題(主題標籤):

var http = require('http'); 

var options = { 
    host: '127.0.0.1', 
    port: 8092, 
    path: '/social/_design/dev_tags/_view/tags?full_set=true&connection_timeout=60000&group=true', 
    method: 'GET' 
} 

http.request(
    options, 
    function(res) { 
     var buf = new Buffer(0); 
     res.on('data', function(data) { 
      buf += data; 
     }); 
     res.on('end', function() { 
      var tweets = JSON.parse(buf); 
      var rows = tweets.rows; 
      rows.sort(function (a,b){ return b.value - a.value } 
      ); 


      for (var i = 0; i < 10; i++) { 
       console.log(rows[i]); 
      } 
     }); 
    } 
    ).end(); 

在同一時間,我在看其他的選擇來實現這一

+0

嗯,我在接受這個答案很捨不得,雖然我知道「你不能排序值」,我認爲它最終將由couchbase有待解決的問題開發人員,所以這個問題的長久... – chutsu

+0

@chutsu,我給的答案是Couchbase 2.0(你是對的未來產品Couchbase可能會提供方式來實現這一點)帕維爾的問題是一個經典的時候與Couchbase觀點一起工作,這就是爲什麼我想讓自己清楚。 –

+0

「Pavel的問題是一個經典問題」,你的意思是我的問題? :p – chutsu

1

我通過使用複合鍵解決了這個問題。

function (doc, meta) { 
    emit([doc.constraint,doc.yoursortvalue]); 
} 

url元素:

&startkey=["jim",5]&endkey=["jim",10]&descending=true 
相關問題