Couchdb计数唯一文档字段

Couchdb计数唯一文档字段,couchdb,Couchdb,我将访问统计数据存储在couchdb文档中,并希望在一段时间间隔内显示唯一IP的计数,我的设计文档是: { "unique": { "map": "function(doc){ if (doc.type=='stats'){ emit([doc.date], doc.ip); } }" } 我使用startKey和endKey来指示开始和结束日期,但我找不到如何计算唯一的IP值。获取唯一值的唯一方法是在密钥中包含您希望唯一的值,并对结果进行分组 然后,为了获得一个计数,您需要创建一个re

我将访问统计数据存储在couchdb文档中,并希望在一段时间间隔内显示唯一IP的计数,我的设计文档是:

{
"unique": {
   "map": "function(doc){ if (doc.type=='stats'){ emit([doc.date], doc.ip); } }"
}

我使用startKey和endKey来指示开始和结束日期,但我找不到如何计算唯一的IP值。获取唯一值的唯一方法是在密钥中包含您希望唯一的值,并对结果进行分组

然后,为了获得一个计数,您需要创建一个reduce函数(尽管在这种特殊情况下,CouchDB中已经内置了一个)

因此,您可以将视图更改为以下内容:

{
  "unique": {
    "map": "function(doc){if(doc.type=='stats'){emit([doc.date, doc.ip], 1);}}"
    "reduce": "_sum"
}
http://your.server/your_db/_design/your_views/_view/unique?startkey=["2012-07"]&endkey=["2012-08"]&group=true
(请注意,我使用了您的
doc.date
,它假设这只具有查找唯一IP计数所需的粒度,并且它将按照合理的词汇顺序排序,例如,它具有类似“2012-07-01”的值,而不是类似“7/1/2012”的值)

然后,您可以使用以下内容运行此查询:

{
  "unique": {
    "map": "function(doc){if(doc.type=='stats'){emit([doc.date, doc.ip], 1);}}"
    "reduce": "_sum"
}
http://your.server/your_db/_design/your_views/_view/unique?startkey=["2012-07"]&endkey=["2012-08"]&group=true

(您需要对
[]“
s进行url编码,除非您使用的是浏览器(浏览器为您提供此功能))

视图显示按IP重复次数分组的文档,但我需要按日期获取IP的计数,已尝试过\u计数未成功您的评论听起来好像您没有实际添加reduce。您需要仔细阅读/尝试我写的内容。我直接从工作视图复制它,完全按照您的要求进行操作。每天计算一个唯一值。您r视图显示如下内容:
{“行”:[{“键”:[“2012-07-02”,“127.0.0.1”],“值”:2},{“键”:[“2012-07-02”,“127.0.0.6”],“值”:1}
但我需要唯一IP的计数哦,我知道你想要什么。不是每个IP的计数,而是所有唯一IP的计数。只需在中读取JSON并执行
行。长度
可能是一个解决方案,但我希望每天有5k-8k的用户。我尝试了一个自定义reduce解决方案:
函数(键、值、重减){var count=0;var uniq_ip={};value.forEach(函数(ip){if(uniq_ip[ip]==未定义){uniq_ip[ip]=1;count++;}});return count;}
带映射:
函数(doc){if(doc.type='stats'){emit([doc date,doc.ip],doc.ip)}