2014-02-03 3 views
1

Я пытаюсь использовать внешний объект внутри mongodb map/reduce функции. Если у объекта есть переменная, к которой он должен обращаться, возникает ошибка.mongodb mapreduce scope - ReferenceError

Например:

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 failed:{ "errmsg" : "exception: ReferenceError: v is not defined", "code" : 16722, "ok" : 0 } at src/mongo/shell/collection.js:970

Это ожидаемое поведение? Есть ли другой способ использования внешних объектов в mapReduce?

ответ

1

Что casuing проблема эта функция:

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

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

С:

return v.data; 

ли в другой области вещественной переменной, которая на самом деле this.v.data.

+0

Я ошибочно пытался получить доступ к v.data, которого не существует (извините, я собирался «вернуть v» вместо этого, теперь отредактировал вопрос), но v пока недоступен. Однако, если я запускаю print (helper.data()); вне mapReduce, он отлично работает. Не следует ли тогда работать с mapReduce? – silyevsk

+0

@silyevsk ах Я не видел, что это не было частью коллекции system.js. Нет, это не сработает, уменьшение карты - это совершенно различная среда и разные области применения – Sammaye

+0

@silyevsk, если вы хотите, чтобы это сработало, вам нужно будет использовать коллекцию system.js, экономя функцию до этого – Sammaye

Смежные вопросы