2013-04-11 62 views
1

我在试图编写一个视图,它显示了我的系统中使用的前10个标签。在reduce函数中使用_count获得金额是相当容易的,但这并不会按数字排序。有没有办法做到这一点?通过按键数量排序的CouchDB/Couchbase视图

function(doc, meta) { 
    if(doc.type === 'log') { 
    emit(doc.tag, 1); 
    } 
} 
_count 

因此,我想有:

  • TAG3 10
  • Tag1中7
  • 与Tag2 3
  • ...

而不是

  • Tag1中7
  • 与Tag2 3
  • TAG3 10

最重要的是,我不想的全套传输到我的应用服务器和处理它。

+0

This? http://stackoverflow.com/questions/2817703/sorting-couchdb-views-by-value – WiredPrairie 2013-04-11 22:34:17

回答

2

在couchbase中,您无法对缩小后的结果进行排序,因此您无法直接获得某项内容的“前10名”。在couchbase视图中,值总是按键排序。最好的办法是:

  1. 查询您的观点,即返回键 - 值对:tag_name - count_value下令tag_name
  2. 创建一个运行每隔N分钟的工作,从[1],对其排序得到的结果,并写入排序结果分开键(即“Top10Tags”)。
  3. 在您的应用程序中,您可以查询关键Top10标签。

这可能会减少流量,但结果可能已过时。你也可以在与couchbase运行的同一台服务器上创建“作业”(即编写小型的node.js应用程序或其他东西),并且它仅回送流量和小的CPU数量,以便每N分钟排序一次。

另外,如果你使用_count减少功能,您不需要发出任何数字,只使用空:

function(doc, meta) { 
    if(meta.type === "json" && doc.type === 'log') { 
    emit(doc.tag, null); 
    } 
} 

如果你想有多个标签,如

标记的文档
{ 
    "type": "log", 
    "tags": ["tag1","tag2","tag3"] 
} 

你的地图功能应该是:有关TOP10榜单

function(doc, meta) { 
    if(meta.type === "json" && doc.type === 'log') { 
    for(var i = 0; i < doc.tags.length; i++){ 
     emit(doc.tags[i], null); 
    } 
    } 
} 

一两件事。如果您不想将其存储在磁盘上,则可以将其存储在memcache存储桶中。

0

你觉得很容易,但并不是真的。

在couchdb中,我会使用列表函数,并使用JavaScript sort()排序结果。这样它们都在服务器端进行排序,并且您可以让列表只返回前10位。

请记住,对于大型数据集,这将会很慢。

+0

嗯,将设置传输到服务器不是我的选择。我经常需要这些数据,这导致了太多的网络流量,造成了一个太简单的问题。 – Patrick 2013-04-12 09:44:24