【问题标题】:Count documents of certain type (filter against user before)计算某种类型的文档(之前过滤用户)
【发布时间】:2011-11-04 11:38:00
【问题描述】:

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

我想知道,steve 有多少 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

效果很好

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

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

【问题讨论】:

    标签: couchdb mapreduce


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 关于找到史蒂夫的所有类型的要点。一旦有成百上千种类型,这可能是个问题。但我怀疑在实际应用程序中可以管理的很少。
    【解决方案2】:

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

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

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

    【讨论】:

    • 当然,但人们通常喜欢免费获得 2 倍以上的性能提升。 :P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多