MongoDB MapReduce: глобальные переменные в экземпляре функции карты? - PullRequest
7 голосов
/ 08 июня 2010

Я написал MapReduce в MongoDB и хотел бы использовать глобальную переменную в качестве кэша для записи / чтения. Я знаю, что невозможно иметь глобальные переменные в экземплярах функции карты - я просто хочу глобальную переменную в каждого экземпляра функции. Этот тип функциональности существует в MapReduce Hadoop, поэтому я ожидал, что он будет в 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';
  }
}

Разрешено ли это в реализации MapReduce MongoDB, или я что-то не так делаю в JavaScript (не имеет опыта в JS)?

Ответы [ 2 ]

5 голосов
/ 10 июня 2010

Глядя на документы , я нахожу следующее:

db.runCommand(
 { mapreduce : <collection>,
   map : <mapfunction>,
   reduce : <reducefunction>
   [, scope : <object where fields go into javascript global scope >]
 }
);

Я думаю, что вам нужна переменная "scope".

Есть тест / пример на Github , который использует переменную "scope".

Я все еще новичок в этом, но, надеюсь, этого достаточно, чтобы вы начали.

1 голос
/ 21 сентября 2012

Как сказал Gates VP, вам нужно добавить кеш в глобальную область видимости.Итак, чтобы дать полный ответ, учитывая ваш сценарий, вам нужно сделать следующее:

db.runCommand(
 { mapreduce : <your collection>,
   map : <your map function, or reference to it>,
   reduce : <your reduce function, or reference to it>,
   scope : { cache : {} }
 }
);

Команда вставит содержимое параметра объекта scope в ваш глобальный контекст.Кэширование будет работать в соответствии с тем, как вы используете его в своей функции карты.Я проверял это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...