CouchDB查看SUM&GROUP BY的等价物

bla*_*666 6 couchdb

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

视图怎么样?

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

地图:

function(doc) {
  if(doc.tag) emit(doc.tag, 1); 
}
Run Code Online (Sandbox Code Playgroud)

降低:

function(keys, values) {
  return sum(values);
}
Run Code Online (Sandbox Code Playgroud)

但是如何对结果进行分组以便我可以按特定的userId过滤查询?

bla*_*666 8

回答我自己的问题.

好像CouchDB支持数组作为键.考虑到这一点,它非常简单:

地图:

function(doc) {
  if(doc.tag) emit([doc.userId, doc.tag], 1); 
}
Run Code Online (Sandbox Code Playgroud)

降低:

function(keys, values) {
  return sum(values);
}
Run Code Online (Sandbox Code Playgroud)

然后,结果按userId&tag排序.

  • 只是为了添加它,您可以使用`group_level`视图参数来实现减少计算的不同粒度级别.如果您将日期用作键的数组,则可能最好地证明了这一点.`[年,月,日]`.在这种情况下,`group_level = 1`将获得年份的聚合,`group_level = 2`将按月计算,'group_level = 3`将按日计算. (3认同)
  • 另外一件事,如果您只使用`_sum`作为reduce函数,CouchDB将自动使用预先编写的Erlang函数,该函数的执行速度比JavaScript等效函数快得多.(其他示例都记录在案[此处](http://wiki.apache.org/couchdb/Built-In_Reduce_Functions)) (3认同)