【问题标题】:mongodb mapreduce scope - ReferenceErrormongodb mapreduce 范围 - ReferenceError
【发布时间】:2014-02-26 16:15:36
【问题描述】:

我正在尝试在 mongodb map/reduce 函数中使用外部对象。如果对象有一个它应该访问的变量,则会发生错误。

例如:

var conn = new Mongo();
var db = conn.getDB("test");

var HelperClass = function() {
  var v = [1, 2, 3];

  this.data = function() {
    return v;
  };
};

var helper = new HelperClass();

var map = function() {
  helper.data().forEach(function(value) {
    emit(value, 1);
  });
};

var reduce = function(key, values) {
  var count = 0;
  values.forEach(function(entry) {
    count += entry;
  });
  return count;
};

db.test.mapReduce(map, reduce, {
  out: "temp",
  scope: {
    helper: helper
  }
});

mongodb 的输出:

map reduce 失败:{ "errmsg" : "exception: ReferenceError: v is not 定义”,“代码”:16722,“确定”:0 } 在 src/mongo/shell/collection.js:970

这是预期的行为吗?有没有其他方法可以在 mapReduce 中使用外部对象?

【问题讨论】:

    标签: javascript mongodb scope mapreduce


    【解决方案1】:

    导致问题的是这个函数:

    var HelperClass = function() {
      var v = [1, 2, 3];
    
      this.data = function() {
        return v.data;
      };
    };
    

    自:

    return v.data;
    

    与实际变量 this.v.data 处于不同的范围内。

    【讨论】:

    • 我错误地尝试访问不存在的 v.data (对不起,我打算“返回 v”,现在编辑问题),但无论如何都无法访问 v。但是,如果我运行 print(helper.data());在 mapReduce 之外,它工作正常。那么它不应该也可以在 mapReduce 中工作吗?
    • @silyevsk 啊,我没有看到它不是 system.js 集合的一部分。不行,不行,map reduce是完全不同的环境,不同的作用域
    • @silyevsk 如果你想让它工作,你需要使用 system.js 集合将函数保存到那个
    • 我试试system.js,谢谢!虽然我仍然不明白为什么它不起作用,但我认为通过范围参数将辅助变量传递给 mapReduce 应该可以工作。
    • @silyevsk 它不起作用,因为 shell 脚本不是 MongoDB 而 Map Reduce 是 MongoDB,它是两个完全独立的环境
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2012-03-30
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多