计算某种类型的文件(以前过滤用户)

Aro*_*ost 3 couchdb mapreduce

文件(伪,rev和id省略):

{
   "type": 1,
   "username": "aron",
   "data": { ... }
}
{
   "type": 1,
   "username": "bob",
   "data": { ... }
}
{
   "type": 1,
   "username": "steve",
   "data": { ... }
}
{
   "type": 1,
   "username": "steve",
   "data": { ... }
}
{
   "type": 2,
   "username": "steve",
   "data": { ... }
}
{
   "type": 3,
   "username": "steve",
   "data": { ... }
}
{
   "type": 3,
   "username": "steve",
   "data": { ... }
}
{
   "type": 3,
   "username": "steve",
   "data": { ... }
}
Run Code Online (Sandbox Code Playgroud)

我想知道,有多少1/2/3型史蒂夫文件.

视图:

count: {
    map: function (doc) { 
        emit([doc.username, doc.type], 1);  
    }
    reduce: function (key, values, rereduce) {
        return sum(values);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我要求了

/database/_design/myDesign/_view/count?key=["steve",1] // result: 2
/database/_design/myDesign/_view/count?key=["steve",2] // result: 1
/database/_design/myDesign/_view/count?key=["steve",3] // result: 3
Run Code Online (Sandbox Code Playgroud)

非常有效.

为了聪明,我想知道我是否可以在一个视图中查询?

有没有办法在一个视图中计算未知类型的文档数量?

Rob*_*son 5

您可以使用这样的正文POST到您的视图;

{"keys":[["steve",1], ["steve",2]]}
Run Code Online (Sandbox Code Playgroud)

另外,尝试使用"_sum"作为reduce函数,它将在Erlang中本机运行,并且应该比在Javascript中运行快几倍.


Vic*_*let 5

您可以执行范围查询来实现此目的:

.../count?startkey=["steve",1]&endkey=["steve",3]&group=true&reduce=true
Run Code Online (Sandbox Code Playgroud)

["steve",1]这将为之间(含)之间的每个键获取一行["steve",3]。您可以根据您的实际类型调整03。例如,如果您的类型可以是任何标量值,则可以使用["steve",null]["steve",{}]作为范围边界。