在map函数中使用RegExp

时间:2011-02-25 12:43:06

标签: regex mongodb mapreduce

我想在MongoDB中使用MapReduce数据。 数据是这样的:

{
  type: 'DOMcheck',
  category: 'Bad label name',
  url: 'http://s1.app.int/part/module/doc/2'
  ...
}

现在,我想收集所有日志,并按网址的/part/module部分计算uniq。 我创建了map函数:

function() {
  var  re = new RegExp(/^(http:\/\/[\w\.]*)(\/[\w]*\/[\w]*)/),
       u = [];
  u = this.url.match(re);
  emit(u[2], 1);
}

reduce功能:

function(key, val) {
  var sum = 0;
  for(var i in val) sum += val[i];
  return sum;
}

并调用MapReduce:res = db.logs.mapReduce(m, r, {query: {type:"DOMcheck", category: /bad/i}})

但我有一个错误:

uncaught exception: map reduce failed: {
"assertion" : "map invoke failed: JS Error: TypeError: u has no properties nofile_b:3",
"assertionCode" : 9014,
"errmsg" : "db assertion failure",
"ok" : 0
}

此处map功能有什么问题?如果我emit(this.url, 1)地图效果很好......

2 个答案:

答案 0 :(得分:1)

看起来你的正则表达式与网址不匹配。这就是为什么你没有属性。

答案 1 :(得分:0)

您可以设置无效记录百分比以跳过所需的无效记录数量而不是失败的作业。并且您可以为无效记录添加计数器。