Както бе посочено от @Dave Griffith, можете да използвате scope
параметър на mapReduce
функция.
Малко се потрудих да разбера как правилно да го предам на функцията, защото, както беше посочено от други, документацията не е много подробна. Най-накрая разбрах, че mapReduce
очаква 3 параметъра:
- функция за карта
- функция за намаляване
- обект с един или повече от параметрите, дефинирани в документа
В крайна сметка стигнах до следния код в 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
}
}
);