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

时间:2011-08-26 12:03:08

标签: couchdb mapreduce

Documents(伪,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": { ... }
}

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

查看:

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

现在我要求

/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

效果非常好

对于聪明的事情,我想知道我是否可以在一个视图中查询它?

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

2 个答案:

答案 0 :(得分:5)

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

{"keys":[["steve",1], ["steve",2]]}

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

答案 1 :(得分:4)

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

.../count?startkey=["steve",1]&endkey=["steve",3]&group=true&reduce=true

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