Я пытаюсь использовать внешний объект внутри 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?
Я ошибочно пытался получить доступ к v.data, которого не существует (извините, я собирался «вернуть v» вместо этого, теперь отредактировал вопрос), но v пока недоступен. Однако, если я запускаю print (helper.data()); вне mapReduce, он отлично работает. Не следует ли тогда работать с mapReduce? – silyevsk
@silyevsk ах Я не видел, что это не было частью коллекции system.js. Нет, это не сработает, уменьшение карты - это совершенно различная среда и разные области применения – Sammaye
@silyevsk, если вы хотите, чтобы это сработало, вам нужно будет использовать коллекцию system.js, экономя функцию до этого – Sammaye