Mapreduce 使用couchdb创建进行分组和唯一计数的视图

Mapreduce 使用couchdb创建进行分组和唯一计数的视图,mapreduce,couchdb,Mapreduce,Couchdb,嗨,我有这样的文件 { domains: "domain1.com", ip: "192.168.0.1" } 文档可能具有不同或重复的域/IP 我想要一个能给我一个列表的视图 domain1=>该域的唯一ip计数 domain2=>该域的唯一ip计数 等等 我知道如何获得: 域=>此映射/减少的ip计数: "map": "function(doc) { emit(doc.domains, 1) }",<br/> "reduce": "_sum" “映射”:“函

嗨,我有这样的文件

{ 
  domains: "domain1.com", 
  ip: "192.168.0.1" 
}
文档可能具有不同或重复的域/IP

我想要一个能给我一个列表的视图

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

我知道如何获得:

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

 "map": "function(doc) { emit(doc.domains, 1) }",<br/>
 "reduce": "_sum"
“映射”:“函数(doc){emit(doc.domains,1)}”,
“减少”:“总和”
组=真参数

但我不知道如何获得:

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


为任何帮助干杯,为我的英语道歉

写一个只有地图功能而没有减少功能的视图

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);
}
警告:未测试的代码可能包含错误


最后,在地图视图上调用list函数,并将
键设置为所需的域。请注意,如果每个域都有大量IP,此解决方案的性能将不会很好。

正如Kim所说,使用CouchDB的Map/reduce几乎不可能(或者可能使用非常复杂的
reduce
函数)完成整个任务

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

因此,首先使用
map
索引(域、ip)对(值不重要):

然后使用内置功能减少它们:

_count
现在,使用
列表
计算唯一IP:

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
查询它


注意:我还没有测试列表的代码,因此您可能需要稍微修改它。

我认为它不适合仅使用map/reduce视图,但如果将其与列表函数结合使用,它应该是微不足道的。感谢您,如果涉及列表,这对我来说并不重要,事实上我也考虑过这一点,只是在这一点上不知如何完成它。
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));
}