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的MapReduce-reduce运行了多少次?_Mongodb_Mapreduce - Fatal编程技术网

使用MongoDB的MapReduce-reduce运行了多少次?

使用MongoDB的MapReduce-reduce运行了多少次?,mongodb,mapreduce,Mongodb,Mapreduce,我在MongoDB中使用MapReduce,我想我已经对它了如指掌了,但有一点我仍然不明白:reduce运行了多少次 例如,我有一个“项目”集合,每个项目都有一个“类别”。这是测试数据(用javascript编写,用于node.js单元测试): 共有6个项目,5个类别,其中一个类别出现两次,其余一次 在我的map函数中,我发出(this.category.categoryId,{items:1})。(完整的版本包括除#项之外的值对象中的其他度量,但这两种方式的行为都是相同的。) 我的reduce

我在MongoDB中使用MapReduce,我想我已经对它了如指掌了,但有一点我仍然不明白:reduce运行了多少次

例如,我有一个“项目”集合,每个项目都有一个“类别”。这是测试数据(用javascript编写,用于node.js单元测试):

共有6个项目,5个类别,其中一个类别出现两次,其余一次

在我的
map
函数中,我发出
(this.category.categoryId,{items:1})。(完整的版本包括除#项之外的值对象中的其他度量,但这两种方式的行为都是相同的。)

我的
reduce
函数如下所示:

function reduce(key, values) {
  var totals = {
    items: 0
  };

  for (var i = 0; i < values.length; i++) {
    totals.items += values[i].items;
  }

  return totals;
};
功能减少(键、值){
风险值总计={
项目:0
};
对于(变量i=0;i
(map中的输出结构与reduce中的输出结构相同,这是需要的。)

因此,我通过mapReduce使用
verbose=true
运行了这个程序,它显示了以下统计信息:

计数:{输出:5,发射:6,减少:1,输入:6}

输入:6个有意义,共有6个文档。 emit:6有意义,它为每个文档发出1个类别。 输出:5个有意义,有5个类别。 但为什么reduce只运行一次呢

现在写出来,它似乎在为每一个出现不止一次的发出的键运行reduce。因此,当一个键只发出一次时,它不会减少它。对吗?确定减少运行次数的数学公式是什么


谢谢大家!

是的,如果只发出一次键,reduce不会运行,这是正确的。我不认为存在一个数学公式可以告诉你reduce将运行多少次

只要有必要。对于大数据集,单个reduce调用将在节点之间分割并同时运行。单个reduce作业块的大小将根据配置的不同而有所不同-文档中说,单个emit不能超过 最大文档大小的一半,所以我认为这意味着最大reduce批处理将具有最大文档大小

function reduce(key, values) {
  var totals = {
    items: 0
  };

  for (var i = 0; i < values.length; i++) {
    totals.items += values[i].items;
  }

  return totals;
};