Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb mongo map reduce和聚合密钥名称的问题_Mongodb_Mapreduce - Fatal编程技术网

Mongodb mongo map reduce和聚合密钥名称的问题

Mongodb mongo map reduce和聚合密钥名称的问题,mongodb,mapreduce,Mongodb,Mapreduce,我的数据库中有一个集合,表示从各种来源提取的IP地址。其中一个示例如下所示: { "_id" : ObjectId("4e71060444dce16174378b79"), "ip" : "xxx.xxx.xxx.xxx", "sources" : { "Source1" : NumberLong(52), "Source2" : NumberLong(7) } } 每个对象将有一个或多个源 我的目标是显示每个源报告的条目数,而不必知道每个可能源的名称(因为可以随时添加新的条目)。我试图用ma

我的数据库中有一个集合,表示从各种来源提取的IP地址。其中一个示例如下所示:

{ "_id" : ObjectId("4e71060444dce16174378b79"), "ip" : "xxx.xxx.xxx.xxx", "sources" : { "Source1" : NumberLong(52), "Source2" : NumberLong(7) } }
每个对象将有一个或多个源

我的目标是显示每个源报告的条目数,而不必知道每个可能源的名称(因为可以随时添加新的条目)。我试图用map reduce解决这个问题,方法是在每个对象的源散列中为每个键发送一个1,但我的语法似乎有问题。如果我这样做:

var map_s = function(){
  for(var source in this.sources) {
    emit(source, 1);
  }
}

var red_s = function(key, values){
  var total = 0;
  values.forEach(function(){
    total++;
  });
  return total;
}

var op = db.addresses.mapReduce(map_s, red_s, {out: 'results'});
db.results.find().forEach(printjson);
我明白了

这对于数据库大小来说太小了。例如,如果我对特定的源进行计数,我会在shell中得到以下内容:

> db.addresses.count({"sources.Source4": {$exists: true}});
1260538

我的错误在哪里?

是的,在reduce方法中有一个问题,它必须是幂等的。 请记住,在中间结果上可能会多次调用reduce()

而不是

values.forEach(function(){
  total++;
});
你需要:

values.forEach(function(x){
  total += x;
});

的确我自己也发现了这一点,但还没有来得及更新这个问题。我的答案如下:
函数red_s(key,values){var total=0;for(var i in values){total+=values[i];}返回total;}
values.forEach(function(x){
  total += x;
});