CouchDB / Couchbase视图按键数排序
CouchDB / Couchbase view ordered by number of keys
我试图写一个视图,显示我在我的系统中使用的前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个。
请记住,对于大型数据集,这将很慢。
相关文章:
- 我们可以在 CouchDB 中对排序列表视图进行排序吗?
- 表排序器寻呼机在调查视图上不起作用
- 在不涉及控制器的情况下对MVC视图列表中的项进行排序
- (钛工作室)显示带有排序数据的表视图
- 等优先级视图排序规则 CouchDB
- AngularJS - 在服务内部对数组进行排序,在控制器/视图中保留绑定
- 如何在WinJS中为列表视图创建排序功能
- CouchDB 中的筛选和排序视图
- 当我使用视图而不是使用Famous的表面进行排序时,ScrollViewContainer不会滚动
- 如何使用布局管理器重新排序/排序嵌套视图而不重新渲染
- 如何在列表视图中使用
类对项目进行排序 - 在backbone.js中,如何使用新的模型数据更新视图,同时在没有完整渲染的情况下保持排序顺序
- 如何在不点击标题的情况下从客户端对网格视图进行排序
- 如何使用函数对Google Charts数据表或数据视图进行排序
- 让backbone.js视图知道jQuery排序表中的更新
- 骨干排序只适用于视图
- 非排序列表视图(插入时显示)
- Mithril.js:如果视图使用子组件,排序数据不会重新渲染
- 未捕获的JS错误在Extbase扩展排序记录在列表视图
- CouchDB / Couchbase视图按键数排序