我试图写一个视图,显示我在我的系统中使用的前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视图中,值总是按键排序。最好的方法是:
- 查询返回键值对的视图:
tag_name - count_value
按tag_name
排序 - 创建每N分钟运行一次的作业,从[1]获取结果,对它们进行排序,并将排序后的结果写入单独的键(即。"Top10Tags")。
- 在你的应用程序中,你查询关键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个。
请记住,对于大型数据集,这将很慢。