【问题标题】:Couchdb count unique document fieldCouchdb 计数唯一文档字段
【发布时间】:2012-07-02 07:39:21
【问题描述】:

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

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

我使用 startKey 和 endKey 来表示开始和结束日期,但我找不到如何计算唯一 IP

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    获得唯一值的唯一方法是在键中包含您希望唯一的值,并对结果进行分组。

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

    所以你改变你的看法是这样的:

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

    (请注意,我使用了您的doc.date,它假设这仅具有您查找唯一 IP 计数所需的粒度,并且它将按合理的词汇顺序排序,例如,它的值类似于“2012-07-01”而不是像“7/1/2012”这样的值)

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

    http://your.server/your_db/_design/your_views/_view/unique?startkey=["2012-07"]&endkey=["2012-08"]&group=true
    

    (您需要对[]"s 进行 url 编码,除非您使用的是浏览器(它会为您执行此操作))

    【讨论】:

    • 查看显示按 IP 重复分组的文档,但我需要按日期获取 IP 的计数,已经尝试 _count 没有成功
    • 您的评论听起来好像您实际上并没有添加reduce。您需要仔细阅读/尝试我写的内容。我直接从工作视图中复制了它,完全按照您的要求进行。每天唯一值的计数。
    • 您的视图显示如下内容:{"rows":[ {"key":["2012-07-02","127.0.0.1"],"value":2}, {"key":["2012-07-02","127.0.0.6"],"value":1} ]} 但我需要计算唯一 IP
    • 哦,我明白你想要什么了。不是每个 IP 的计数,而是所有唯一 IP 的计数。只需阅读 JSON 并执行 rows.length
    • 也许是一个解决方案,但我希望每天有 5k-8k 的用户。我试图做一个自定义减少解决方案:function(keys, values,rereduce) { var count = 0; var uniq_ip = {}; values.forEach(function(ip) { if (uniq_ip[ip] == undefined) { uniq_ip[ip]=1; count++; } }); return count; } 使用地图:function(doc){ if (doc.type=='stats'){ emit([doc.date,doc.ip], doc.ip); } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多