Jak zauważył @Dave Griffith, możesz użyć scope
parametr mapReduce
funkcja.
Trochę się zmagałem, aby dowiedzieć się, jak poprawnie przekazać to do funkcji, ponieważ, jak podkreślają inni, dokumentacja nie jest zbyt szczegółowa. Wreszcie zdałem sobie sprawę, że mapReduce
oczekuje 3 parametrów:
- funkcja mapy
- funkcja redukcji
- obiekt z co najmniej jednym parametrem zdefiniowanym w dokumencie
W końcu dotarłem do następującego kodu w JavaScript:
// I define a variable external to my map and to my reduce functions
var KEYS = {STATS: "stats"};
function m() {
// I use my global variable inside the map function
emit(KEYS.STATS, 1);
}
function r(key, values) {
// I use a helper function
return sumValues(values);
}
// Helper function in the global scope
function sumValues(values) {
var result = 0;
values.forEach(function(value) {
result += value;
});
return result;
}
db.something.mapReduce(
m,
r,
{
out: {inline: 1},
// I use the scope param to pass in my variables and functions
scope: {
KEYS: KEYS,
sumValues: sumValues // of course, you can pass function objects too
}
}
);