CouchDB / Couchbase视图按键数排序

CouchDB / Couchbase view ordered by number of keys

本文关键字:排序 视图 Couchbase CouchDB      更新时间:2023-09-26

我试图写一个视图,显示我在我的系统中使用的前10个标签。在reduce函数中使用_count获取数量是相当容易的,但这并没有按数字排序列表。有什么办法可以做到吗?

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

因此我希望有:

  • Tag3 10
  • 标签1 7
  • 标签2 3
不是

  • 标签1 7
  • 标签2 3
  • Tag3 10

最重要的是,我不想将完整的集合传输到我的应用服务器并在那里处理它。

在couchbase中,你不能在/reduce之后对结果进行排序,所以你不能直接得到某物的"Top 10"。在couchbase视图中,值总是按键排序。最好的方法是:

  1. 查询返回键值对的视图:tag_name - count_valuetag_name排序
  2. 创建每N分钟运行一次的作业,从[1]获取结果,对它们进行排序,并将排序后的结果写入单独的键(即。"Top10Tags")。
  3. 在你的应用程序中,你查询关键top10标签。

这可以减少流量,但结果可能过时。你也可以在couchbase运行的同一台服务器上创建"作业"(即编写小型node.js应用程序或其他东西),它只消耗环回流量和每N分钟排序的小cpu量。

同样,如果你使用_count reduce函数,你不需要发出任何数字,只使用null:

function(doc, meta) {
  if(meta.type === "json" && doc.type === 'log') {
    emit(doc.tag, null);
  }
}
如果你想用多个标签来标记文档,比如
{
  "type": "log",
  "tags": ["tag1","tag2","tag3"]
}

你的map函数应该是:

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

关于top10名单还有一件事。如果您不想将其存储在磁盘上,则可以将其存储在memcache bucket中。

你认为很容易,但实际上并非如此。

在couchdb中,我将使用列表函数,并使用JavaScript sort()对结果排序。这样就可以在服务器端进行排序,并且可以让列表只返回前10个。

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