因此,根据我在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
次出现次数。现在我的问题是如何按计数值排序,而不是键?
由于
答案 0 :(得分: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();
与此同时,我正在寻找实现此目的的其他选择
答案 1 :(得分:1)
我通过使用复合键解决了这个问题。
function (doc, meta) {
emit([doc.constraint,doc.yoursortvalue]);
}
url elements:
&startkey=["jim",5]&endkey=["jim",10]&descending=true