Zoals aangegeven door @Dave Griffith, kunt u de scope
. gebruiken parameter van de mapReduce
functie.
Ik worstelde een beetje om erachter te komen hoe ik het op de juiste manier aan de functie kon doorgeven, omdat, zoals door anderen werd opgemerkt, de documentatie niet erg gedetailleerd is. Ten slotte realiseerde ik me dat mapReduce
verwacht 3 parameters:
- kaartfunctie
- functie verminderen
- object met een of meer van de parameters gedefinieerd in het document
Uiteindelijk kwam ik tot de volgende code in 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
}
}
);