Mapreduce 如何在in Couchbase中按值对“视图”的结果进行排序?

Mapreduce 如何在in Couchbase中按值对“视图”的结果进行排序?,mapreduce,couchdb,couchbase,nosql-aggregation,Mapreduce,Couchdb,Couchbase,Nosql Aggregation,根据我在Couchbase的理解,我们可以使用 descending=true 但在我的例子中,我想改为按值排序。考虑JSON格式的推特数据,我的问题是用户最喜欢提到的是什么? < /P> 每条推文的结构如下: { "text": "", "entities" : { "hashtags" : [ ... ], "user_mentions" : [ ...], "urls" : [ ... ] } 因此,在重用Map函数之前,

根据我在Couchbase的理解,我们可以使用

descending=true
但在我的例子中,我想改为按值排序。考虑JSON格式的推特数据,我的问题是<强>用户最喜欢提到的是什么?<强> < /P> 每条推文的结构如下:

{
    "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函数
\u count
统计所有
屏幕名称
出现的次数。现在我的问题是如何按照计数值而不是键进行排序?


谢谢

简而言之,您不能按查看结果的值排序。只能按键排序

一些解决办法是:

  • 在将数据插入Couchbase之前分析数据,并为您感兴趣的值创建计数器(在您的案例中提到)

  • 如果视图的大小可用于客户端排序,请使用您必须根据应用程序大小排序的视图

下面的JS代码调用一个视图,对结果进行排序,并打印10个最热门的主题(hashtags):

var http=require('http');
变量选项={
主持人:“127.0.0.1”,
港口:8092,
路径:'/social/\u design/dev\u tags/\u view/tags?full\u set=true&connection\u timeout=60000&group=true',
方法:“获取”
}
http.request(
选项,
功能(res){
var buf=新缓冲区(0);
res.on('数据'),函数(数据){
buf+=数据;
});
res.on('end',function(){
var tweets=JSON.parse(buf);
var rows=tweets.rows;
sort(函数(a,b){返回b.value-a.value}
);
对于(变量i=0;i<10;i++){
console.log(行[i]);
}
});
}
).end();

同时,我正在寻找其他选项来实现这一点

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

function (doc, meta) {
  emit([doc.constraint,doc.yoursortvalue]);
}
url元素:

&startkey=["jim",5]&endkey=["jim",10]&descending=true

嗯,我很不愿意接受这个答案,虽然我知道“你不能按值排序”,但我认为这是一个最终会被couchbase开发者解决的问题,所以为了这个问题的长久性…@chutsu,我给出的答案是couchbase 2.0(你是对的,未来产品Couchbase可能会提供实现这一点的方法)Pavel的问题在Couchbase view中是一个经典问题,这就是为什么我想澄清的原因。“Pavel的问题是一个经典问题”,你是指我的问题吗?:我使用的是2.2,但仍然是同一个问题,有人解决了这个问题吗?
&startkey=["jim",5]&endkey=["jim",10]&descending=true