选择distinct count cloudant / couchdb

时间:2015-06-28 22:04:49

标签: mapreduce lucene couchdb cloudant nosql

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

我的文件如下:

{
app:'应用名称',
类型:'页面视图|登录|等..',
 老板: 'email_of_the_user',
 设备:'iphone | android |等。',
日期:  'YYYY-MM-DD'
 }

我尝试过一些地图缩减和分面搜索,但到目前为止找不到我想要的结果。

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

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

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

选择应用,日期,计数(*)FROM LOGS按日期分组,所有者,应用

ant结果如下:

'App1','2015-06-01',200
'App1','2015-06-02',232
'App2','2015-06-01',142
'App2','2015-06-02',120

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

3 个答案:

答案 0 :(得分:1)

您可以使用设计文档来完成此操作,如Cesar所述。一个具体的例子是创建一个视图,其中您的地图函数会发出您要分组的字段,例如:

function(doc) {
  emit(doc.email, 1);
}

然后,选择所需的缩小功能(例如_count)。在Cloudant仪表板上查看此内容时,请确保选择 Reduce 作为查询选项的一部分。通过URL访问视图时,您需要传递适当的参数(reduce=true&group=true)。

此处的观看文档非常详尽:https://docs.cloudant.com/creating_views.html

答案 1 :(得分:0)

根据您的需要,canant / couchdb上有一个名为设计文档的功能。有关详细信息或本指南,您可以查看其文档以获取此功能: http://guide.couchdb.org/draft/design.html

Cloudant文档: https://docs.cloudant.com/design_documents.html 设计文档是SQL世界的类似视图。

此致

答案 2 :(得分:0)

我们可以使用Cloudant Java API在我们的项目中执行此操作...

https://github.com/cloudant/java-cloudant

你应该能够通过创建一个具有这样的地图功能的视图来获得这种结果......

function(doc) {
    emit([doc.app, doc.date, doc.owner], 1);
}

reduce函数应如下所示:

function(keys, values, rereduce){
    if (rereduce){
        return sum(values);
    } else {
        return sum(values);
    }
}

然后我们使用以下查询来获取我们想要的数据。

Database db = ....
db.view(viewName).startKey(startKeys).endKey(endKeys)
            .group(true).includeDocs(false).query(castClass)

我们提供了视图名称和一些开始和结束键(因为我们发出了一个复合键,我们需要提供一个过滤器),然后使用group方法根据需要返回数据。

修订..

使用map函数中的这个新的emit键,您应该得到如下结果:

{[
{[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}
]}

如果您使用好的开始和结束键,您查询的记录数量将保持很小,您获得的记录数量是您正在寻找的唯一身份访问者。请注意,在这种情况下,您可以获得比您想要的更多,但它确实有效。