2

嗨,我有这样的文件

{ 
  domains: "domain1.com", 
  ip: "192.168.0.1" 
}

文档可能具有不同或重复的域/IP

我想要一个视图,给我一个列表

domain1 => 该域的
唯一 ip 计数 domain2 =>该域的唯一 ip 计数
等。

我知道如何获得:

域 => 使用此映射/减少的 ip 计数:

 "map": "function(doc) { emit(doc.domains, 1) }",<br/>
 "reduce": "_sum"

和一个 group=true 参数

但我不知道如何获得:

域 => 唯一 ip 计数样式列表

为任何帮助欢呼,对不起我的英语

4

2 回答 2

0

reduce正如 Kim 所说,用 CouchdDB 的 Map/Reduce 完成所有事情几乎是不可能的(或者可能是一个非常棘手的功能)。

但是,您至少可以使用 Map/Reduce 执行重复数据删除部分,以获得比使用 Kim 的解决方案更好的性能。

因此,首先使用 amap来索引 (domain, ip) 对(值不重要):

function(o) {
  emit([o.domain, o.ip], null);
}

然后reduce他们使用内置函数:

_count

现在,使用 alist来计算唯一 ips:

function(head, req) {
  var domains = {};
  while (row = getRow()) {
    var d = row.key[0];
    if (d in domains) {
      domains[d]++;
    } else {
      domains[d] = 1;
    }
  }
  send(JSON.stringify(domains));
}

当您调用它时,使用 查询它group=true

注意:我没有测试列表的代码,所以你可能需要稍微调整一下。

于 2013-07-19T08:02:19.130 回答
0

写一个只有map函数没有reduce函数的视图

function(doc) {
  if (doc.domains) emit(doc.domains, doc.ip);
}

然后创建一个计算唯一条目的列表函数。

function(head, req) {
  var ips = new Array();
  while (row = getRow()) {
    if (ips.indexOf(row) != -1) { 
      ips.push(row.value);
    }
  }
  send(ips.length);
}

警告:代码未经测试,可能包含错误。

最后,您在地图视图上调用列表函数,并将其key设置为您想要的域。请注意,如果每个域有大量 IP,此解决​​方案的性能将不会很好。

于 2013-07-18T16:55:09.027 回答