4

因此,据我在 Couchbase 中的理解,人们可以通过使用对键进行排序*

descending=true

但在我的情况下,我想按值排序。考虑 json 格式的 Twitter 数据,我的问题是最受欢迎的用户提到了什么?

每条推文的结构如下:

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

因此,在我重用 Map 函数之前使用过 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);
      }
    }
  )
}

然后我使用reduce函数_count来计算所有出现的screen_name次数。现在我的问题是如何按计数值而不是键排序?

谢谢

4

2 回答 2

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();

同时,我正在寻找其他选择来实现这一目标

于 2012-11-11T12:03:39.707 回答
1

我通过使用复合键解决了这个问题。

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

网址元素:

&startkey=["jim",5]&endkey=["jim",10]&descending=true
于 2014-03-17T20:48:42.287 回答