CouchDB视图相当于SUM&;分组

CouchDB视图相当于SUM&;分组,couchdb,Couchdb,我有多个CouchDB文档,它们表示一个带有属性userId和标记的时间戳(一个用户可以有n个时间戳,并为每个时间戳分配一个标记)。我想通过特定的userId查询CouchDB,并获得用户使用过的标记的排序列表(按事件排序) 风景会是什么样子 如果我想获得一个按事件排序的所有标记的列表(无论来自哪个用户),或者如果我假设只有具有相同用户ID的文档,我会这样做: 地图: function(doc) { if(doc.tag) emit(doc.tag, 1); } function(key

我有多个CouchDB文档,它们表示一个带有属性userId和标记的时间戳(一个用户可以有n个时间戳,并为每个时间戳分配一个标记)。我想通过特定的userId查询CouchDB,并获得用户使用过的标记的排序列表(按事件排序)

风景会是什么样子

如果我想获得一个按事件排序的所有标记的列表(无论来自哪个用户),或者如果我假设只有具有相同用户ID的文档,我会这样做:

地图:

function(doc) {
  if(doc.tag) emit(doc.tag, 1); 
}
function(keys, values) {
  return sum(values);
}
function(doc) {
  if(doc.tag) emit([doc.userId, doc.tag], 1); 
}
function(keys, values) {
  return sum(values);
}
减少:

function(doc) {
  if(doc.tag) emit(doc.tag, 1); 
}
function(keys, values) {
  return sum(values);
}
function(doc) {
  if(doc.tag) emit([doc.userId, doc.tag], 1); 
}
function(keys, values) {
  return sum(values);
}

但是如何对结果进行分组,以便根据特定的用户ID过滤查询?

回答我自己的问题

看起来CouchDB支持数组作为键。考虑到这一点,它非常简单:

地图:

function(doc) {
  if(doc.tag) emit(doc.tag, 1); 
}
function(keys, values) {
  return sum(values);
}
function(doc) {
  if(doc.tag) emit([doc.userId, doc.tag], 1); 
}
function(keys, values) {
  return sum(values);
}
减少:

function(doc) {
  if(doc.tag) emit(doc.tag, 1); 
}
function(keys, values) {
  return sum(values);
}
function(doc) {
  if(doc.tag) emit([doc.userId, doc.tag], 1); 
}
function(keys, values) {
  return sum(values);
}

然后按userId和tag对结果进行排序。

除此之外,还可以使用
group\u level
view参数实现不同的粒度级别,以减少计算量。如果使用日期作为密钥的数组,这可能是最好的证明<代码>[年、月、日]。在这种情况下,
group\u level=1
将获得一年的合计,
group\u level=2
将按月计算,
group\u level=3
将按日计算。还有一件事,如果您只使用
\u sum
作为缩减函数,CouchDB将自动使用一个预编写的Erlang函数,该函数的执行速度将比JavaScript等效函数快得多。(其他示例都有文档记录)这并不是按事件排序的。我们如何根据
和(值)
而不是键对结果排序?类似于SQL中的按计数排序(*)DESC。