Mapreduce 选择distinct count cloudant/couchdb

Mapreduce 选择distinct count cloudant/couchdb,mapreduce,lucene,couchdb,cloudant,nosql,Mapreduce,Lucene,Couchdb,Cloudant,Nosql,我正在使用Cloudant启动一个项目。 这是一个简单的日志系统,因此我可以跟踪我的应用程序的使用情况 我的文档如下所示: function(keys, values, rereduce){ if (rereduce){ return sum(values); } else { return sum(values); } } {[ {[app1, 2015,06,28, john@somewhere.net], 12}, <- jo

我正在使用Cloudant启动一个项目。 这是一个简单的日志系统,因此我可以跟踪我的应用程序的使用情况

我的文档如下所示:

function(keys, values, rereduce){
    if (rereduce){
        return sum(values);
    } else {
        return sum(values);
    }
}
{[
{[app1, 2015,06,28, john@somewhere.net], 12}, <- john visited 12 times     on that day...
{[app1, 2015,06,29, john@somewhere.net], 10},
{[app1, 2015,06,28, ann@somewhere.net], 1}
]}
{
应用程序:'应用程序名称',
类型:'page view | login | etc..',
所有者:“给用户发送电子邮件,
设备:“iphone | android |等…”,
日期: “yyyy-mm-dd”
}

我试着做一些地图缩小和分面搜索,但到目前为止找不到我想要的结果

我想计算按同一所有者、日期(yyyy-mm-dd)和应用程序分组的不同文档的数量

[例如,如果同一个人在同一日期登录应用程序两次或20次,则只计算一次。 我想统计每天有多少个人用户使用一个应用程序,不管他使用的是什么类型的日志或设备。]

如果是SQL,假设文档的每个键都是一列,我会这样查询:

function(keys, values, rereduce){
    if (rereduce){
        return sum(values);
    } else {
        return sum(values);
    }
}
{[
{[app1, 2015,06,28, john@somewhere.net], 12}, <- john visited 12 times     on that day...
{[app1, 2015,06,29, john@somewhere.net], 10},
{[app1, 2015,06,28, ann@somewhere.net], 1}
]}
按日期、所有者、应用程序从日志组中选择应用程序、日期、计数(*)

ant结果会是这样的:

“App1”,“2015-06-01”,200
“App1”,“2015-06-02”,232
“附录2”、“2015-06-01”142
“App2”,“2015-06-02”,120


如何使用Cloudant/CouchDB获得相同的结果?

对于您需要的内容,couldant/CouchDB上有一个称为设计文档的功能。有关此功能的详细信息,您可以查看他们的文档或本指南:

Cloudant文档: 设计文档是SQL世界上类似的视图


关于这一点,

我们在项目中使用Cloudant Java API实现了这一点

您应该能够通过创建一个具有如下映射功能的视图来获得这种结果

function(doc) {
    emit([doc.app, doc.date, doc.owner], 1);
}
reduce函数应如下所示:

function(keys, values, rereduce){
    if (rereduce){
        return sum(values);
    } else {
        return sum(values);
    }
}
{[
{[app1, 2015,06,28, john@somewhere.net], 12}, <- john visited 12 times     on that day...
{[app1, 2015,06,29, john@somewhere.net], 10},
{[app1, 2015,06,28, ann@somewhere.net], 1}
]}
然后我们使用下面的查询来获取我们想要的数据

Database db = ....
db.view(viewName).startKey(startKeys).endKey(endKeys)
            .group(true).includeDocs(false).query(castClass)
我们提供了视图名称和一些开始键和结束键(因为我们发出了一个复合键,需要提供一个过滤器),然后使用group方法按需要取回数据

修订的

使用map函数中的新emit键,您将获得如下结果:

function(keys, values, rereduce){
    if (rereduce){
        return sum(values);
    } else {
        return sum(values);
    }
}
{[
{[app1, 2015,06,28, john@somewhere.net], 12}, <- john visited 12 times     on that day...
{[app1, 2015,06,29, john@somewhere.net], 10},
{[app1, 2015,06,28, ann@somewhere.net], 1}
]}
{[

{[app1,2015,06,28,john@somewhere.net],12},如Cesar所述,您可以使用设计文档来实现这一点。一个具体的示例是创建一个视图,在该视图中,您的映射函数将在您要分组的位置上发出字段,例如:

function(doc) {
  emit(doc.email, 1);
}
然后,选择所需的reduce函数(例如
\u count
)。在Cloudant仪表板上查看此函数时,确保选择reduce作为查询选项的一部分。通过URL访问视图时,需要传递适当的参数(
reduce=true&group=true


这里关于视图的文档非常详尽:

我已经尝试过了。问题是重复的数据正在统计中。snapituser1@domain.com登录iphone 2015-06-29 snapituser1@domain.com照片iphone 2015-06-29 snapituser1@domain.com登录iphone 2015-06-29 snapituser1@domain.com登录iphone 2015-06-30 snapituser2@domain.com日志安卓2015-06-29 snapituser2@domain.com登录android 2015-06-30 snapituser3@domain.com登录android 2015-06-30这应该返回2015-06-29-2(当天每个用户有两个单独的日志)2015-06-30-3(三个…)但是我得到了:2015-06-29-4 2015-06-30-3您是否尝试过向发出的密钥添加更多字段,这有助于删除重复项…例如,尝试一下这个