在 couchbase 中,您无法在 reduce 中/之后对结果进行排序,因此您无法直接获得“前 10 名”。在 couchbase 视图中,值总是按键排序。最好的方法是:
- 查询返回键值对的视图:
tag_name - count_value
order bytag_name
- 创建每 N 分钟运行一次的作业,从 [1] 获取结果,对它们进行排序,并将排序结果写入单独的键(即“Top10Tags”)。
- 在您的应用程序中,您查询关键 Top10Tags。
这可能会减少流量,但结果可能会过时。您还可以在 couchbase 运行的同一台服务器上创建该“作业”(即编写小型 node.js 应用程序或其他东西),并且它只需要环回流量和少量 cpu 用于每 N 分钟排序一次。
此外,如果您使用 _count reduce 函数,则不需要发出任何数字,只需使用 null:
function(doc, meta) {
if(meta.type === "json" && doc.type === 'log') {
emit(doc.tag, null);
}
}
如果你想让文档被多个标签标记,比如
{
"type": "log",
"tags": ["tag1","tag2","tag3"]
}
您的地图功能应该是:
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 存储桶中。