MongoDB MapReduce:映射函数实例中的全局变量?

MongoDB MapReduce:映射函数实例中的全局变量?,mongodb,mapreduce,Mongodb,Mapreduce,我已经在MongoDB中编写了一个MapReduce,并希望使用一个全局变量作为缓存进行写/读操作。我知道在映射函数实例中不可能有全局变量——我只希望在每个函数实例中有一个全局变量。这种类型的功能存在于Hadoop的MapReduce中,所以我希望它会出现在MongoDB中。但以下几点似乎不起作用: var cache = {}; // Does not seem to work! function () { var hashValue = this.varValue1 + this.var

我已经在MongoDB中编写了一个MapReduce,并希望使用一个全局变量作为缓存进行写/读操作。我知道在映射函数实例中不可能有全局变量——我只希望在每个函数实例中有一个全局变量。这种类型的功能存在于Hadoop的MapReduce中,所以我希望它会出现在MongoDB中。但以下几点似乎不起作用:

var cache = {}; // Does not seem to work!
function () {
  var hashValue = this.varValue1 + this.varValue2;
  if(typeof(cache[hashValue])!= 'undefined') {
    // Do nothing, we've processed at least one input record with this hash
  } else {
    // Process the input record
    // Cache the record
    cache[hashValue] = '1';
  }
}
这是MongoDB的MapReduce实现中不允许的,还是我在JavaScript中做了一些错误的事情(在JS中没有经验)?

查看,我发现如下:

db.runCommand(
 { mapreduce : <collection>,
   map : <mapfunction>,
   reduce : <reducefunction>
   [, scope : <object where fields go into javascript global scope >]
 }
);
db.runCommand(
{mapreduce:,
地图:,
减少:
[,范围:]
}
);
我认为“scope”变量就是您所需要的

有一个使用“scope”变量的测试/示例


我对这方面还是新手,但希望这足以让您开始。

正如盖茨副总裁所说,您需要将缓存添加到全局范围。因此,为了提供完整的答案,考虑到您的脚本,您需要做以下几点:

db.runCommand(
 { mapreduce : <your collection>,
   map : <your map function, or reference to it>,
   reduce : <your reduce function, or reference to it>,
   scope : { cache : {} }
 }
);
db.runCommand(
{mapreduce:,
地图:,
减少:,
作用域:{cache:{}
}
);

该命令将把“scope”对象参数的内容注入全局上下文。然后,缓存将按照您在map函数中使用它的方式工作。我已经对此进行了测试。

谢谢-但不,作用域不是全局读/写,而是只读。顺便说一句,这个例子似乎没有使用作用域传递给map/reduce函数的变量xx。作用域中的变量是完全可写的。github link是deadOK,我又翻了一遍,这里有一点混淆。这个函数是你的map还是reduce?如果您想要一个“临时”缓存,只需在Mongo中创建一个临时集合,并从map或reduce中引用它。但是,如果不知道map()和reduce()函数,就很难说你能否在reduce阶段解决这个问题,这就是map函数。我可以在reduce函数中这样做,但我还有其他的事情需要做,即聚合一些值。我还可以在MongoDB中创建一个集合作为缓存——事实上,我一开始就是这么做的。然而,这并不是一个理想的解决方案(如果有多个map函数实例,那么锁定问题可能会减慢速度)+这是Hadoop的MapReduce中已经存在的一个特性,所以我们在这里也期待它。尽管可以说我挑剔,但我相信这是MongoDB需要解决的问题。