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));
}